Note: This document is a translation of the German koma script manual


Chapter 12: Basic Functions of Package scrbase



Yüklə 2,79 Mb.
Pdf görüntüsü
səhifə31/60
tarix03.02.2017
ölçüsü2,79 Mb.
#7439
1   ...   27   28   29   30   31   32   33   34   ...   60

Chapter 12: Basic Functions of Package scrbase

325

\ifdimen{string }{then instructions }{else instructions }

Note that this does not compare dimensions. The then instructions will be executed, if

the one step expansion of string consists of digits and a valid unit of length. Otherwise, the



else instructions

will be used. There is no corresponding internal command.

\if@atdocument the instructions \else else instructions \fi

This command exists intentionally as internal command only. In the document preamble

\if@atdocument

is same as \iffalse. After \begin{document} it’s the same as \iftrue.

Authors of classes and packages may use this if a command should work somehow different

depending on whether it has been used in the preamble or inside the documents body. Please

note that this is a condition in TEX syntax not in L

A

TEX syntax!



12.4. Definition of Language-Dependent Terms

Normally, one has to change or define language-dependent terms like \captionsenglish in

such a way that, in addition to the available terms, the new or redefined terms are defined.

This is made more difficult by the fact that some packages like german or ngerman redefine

those settings when the packages are loaded. These definitions unfortunately occur in such a

manner as to destroy all previous private settings. That is also the reason why it makes sense to

delay changes with \AtBeginDocument until \begin{document}; that is, after package loading

is completed. The user can also use \AtBeginDocument or redefine the language-dependent

terms after \begin{document}; that is, not put them in the preamble at all. The package

scrbase provides some additional commands for defining language-dependent terms.

\defcaptionname{language list }{term }{definition }

\providecaptionname{language list }{term }{definition }

\newcaptionname{language list }{term }{definition }

\renewcaptionname{language list }{term }{definition }

\defcaptionname*{language list }{term }{definition }

\providecaptionname*{language list }{term }{definition }

\newcaptionname*{language list }{term }{definition }

\renewcaptionname*{language list }{term }{definition }

Using one of these commands, the user can assign a definition for a particular language to

term . Several languages can be concatenated with comma to a language list . The term

is always a macro. The commands differ depending on whether a given language or a term

within a given language are already defined or not at the time the command is called.

If a language is not defined, then \providecaptionname does nothing other than write a

message in the log file. This happens only once for each language. If a language is defined,

but term is not yet defined for it, then it will be defined using definition . The term will


Chapter 12: Basic Functions of Package scrbase

326

not be redefined if the language already has such a definition; instead, an appropriate message

is written to the log file.

The command \newcaptionname has a slightly different behaviour. If a language is

not yet defined, then a new language command will be created and a message written to

the log file. For language USenglish, for example, this would be the language command

\captionsUSenglish

. If term is not yet defined in a language, then it will be defined using



definition

. If term already exists in a language, then this results in an error message.

The command \renewcaptionname again behaves differently. It requires an existing defini-

tion of term in the languages. If neither a language nor term exist or term is unknown in a

defined language, then an error message is given. Otherwise, the term for the language will

be redefined according to definition .

The

v3.12


command \defcaptionname always defines the term . So previous definitions of term

for the given language will be overwritten. You may use this command even for undefined

languages.

KOMA-Script employs \providecaptionname in order to define the commands in

sec-

tion 22.6



.

Example: If you prefer “fig.” instead of “figure” in USenglish, you may achieve this using:

\renewcaptionname{USenglish}{\figurename}{fig.}

If you want the same change not only in USenglish but also in UKenglish, you

do not need an additional:

\renewcaptionname{UKenglish}{\figurename}{fig.}

but can simply extend the language list :

\renewcaptionname{USenglish,UKenglish}{\figurename}{fig.}

You can extend the language list in the same manner by american,

australian

, british, canadian, and newzealand.

Since KOMA-Script 3.12

v3.12


you do not need to delay the definition or redefinition until \begin

{document}

using \AtBeginDocument any longer because scrbase does the delay automatically

for (re)definitions in the document’s preamble. Additionally, scrbase tests if a redefinition

should be made in \extraslanguage instead of \captionslanguage and does so automati-

cally. The new star variants of the commands always use \extraslanguage . So redefinition of

language dependent terms for packages like hyperref that use \extraslanguage should work

as expected by the user.

Language dependent terms usually defined by classes and language packages are listed and

described in

table 12.1

.


Chapter 12: Basic Functions of Package scrbase

327

Table 12.1.: Overview of language dependent terms of usual language packages

\abstractname

heading of the abstract

\alsoname

“see also” in additional cross references of the index

\appendixname

“appendix” in the heading of an appendix chapter

\bibname

heading of the bibliography

\ccname

prefix heading for the distribution list of a letter



\chaptername

“chapter” in the heading of a chapter

\contentsname

heading of the table of contents

\enclname

prefix heading for the enclosure of a letter

\figurename

prefix heading of figure captions

\glossaryname

heading of the glossary

\headtoname

“to” in header of letter pages

\indexname

heading of the index

\listfigurename

heading of the list of figures

\listtablename

heading of the list of tables

. . .


Chapter 12: Basic Functions of Package scrbase

328

Table 12.1.: Overview of usual language dependent terms (continuation)

\pagename

“page” in the pagination of letters

\partname

“part” in the heading of a part

\prefacename

heading of the preface

\proofname

prefix heading of mathematical proofs

\refname

heading of the list of references

\seename

“see” in cross references of the index

\tablename

prefix heading at table captions



12.5. Identification of KOMA-Script

Package scrbase may be used independent of KOMA-Script with other packages and classes.

Nevertheless, it is a KOMA-Script package. For this, scrbase also provides commands to

identify KOMA-Script and to identify itself as a KOMA-Script package.

\KOMAScript

This command only sets the word “KOMA-Script” with sans-serif font and a little bit tracking

for the capitals. By the way: All KOMA-Script classes and packages define this command, if

it has not been defined already. The definition is robust using \DeclareRobustCommand.

\KOMAScriptVersion

KOMA-Script defines the main version of KOMA-Script in this command. It has the form

date version KOMA-Script”. This main version is same for all KOMA-Script classes and the

KOMA-Script packages that are essential for the classes. Because of this, it may be inquired

after loading scrbase, too. For example, this document has been made using KOMA-Script

version “2017/01/03 v3.22 KOMA-Script”.



Chapter 12: Basic Functions of Package scrbase

329

12.6. Extension of the L

A

TEX Kernel

Sometimes the L

A

TEX kernel itself provides commands, but lacks other, similar commands that



would often be useful, too. Some of those commands for authors of packages and classes are

provided by scrbase.

\ClassInfoNoLine{class name }{information }

\PackageInfoNoLine{package name }{information }

For authors of classes and package the L

A

TEX kernel already provides commands like



\ClassInfo

and \PackageInfo to write information. together with the current line number,

into the log-file. Besides \PackageWarning and \ClassWarning to throw warning messages

with line numbers, it also provides \PackageWarningNoLine and \ClassWarningNoLine for

warning messages without line numbers. Nevertheless, the commands \ClassInfoNoLine

and \PackageInfoNoLine for writing information without line numbers into the log-file are

missing. Package scrbase provides them.

\l@addto@macro{command }{extension }

The L

A

TEX kernel already provides an internal command \g@addto@macro to extend the def-



inition of macro \command by extension globally. This may be used only for macros that

have no arguments. Nevertheless, sometimes a command like this, that works locally to a

group instead of globally, could be useful. Package scrbase provides such a command with

\l@addto@macro

. An alternative may be usage of package etoolbox, which provides several of

such commands for different purposes (see [

Leh11

]).


12.7. Extension of the Mathematical Features of ε-TEX

ε

-TEX, that is meanwhile used by L

A

TEX and needed by KOMA-Script, provided with



\numexpr

, an extended feature for calculation of simple arithmetic with TEX counters and

integers. The four basic arithmetic operations and brackets are supported. Correct rounding

is done while division. Sometimes additional operators would be useful.

\XdivY{dividend }{divisor }

\XmodY{dividend }{divisor }

Having a division with remainder command

v3.05a


\XdivY

gives the value of the integer quotient,

with command \XmodY giving the value of the remainder. This kind of division is defined:

dividend

divisor · integer quotient remainder

with dividend and remainder are integer, remainder is greater or equal to divisor, and divisor

is a natural number greater than 0.



Chapter 12: Basic Functions of Package scrbase

330

The value may be used for assignment to a counter or directly in the expression of \numexpr.

For output the value as an Arabic number has to be prefixed by \the.


Chapter 13: Control Package Dependencies with scrlfile

331

Control Package Dependencies with scrlfile

The introduction of L

A

TEX2ε in 1994 brought many changes in the handling of L



A

TEX exten-

sions. Today the package author has many macros available to determine if another package

or class is employed and whether specific options are used. The author can load other packages

or can specify options in the the case that the package is loaded later. This has led to the

expectation that the order in which package are loaded would not be important. Sadly this

hope has not been fulfilled.

13.1. About Package Dependencies

More and more frequently, different packages either newly define or redefine the same macro

again. In such a case the order in which a package is loaded becomes very important. For the

user it sometimes becomes very difficult to understand the behaviour, and in some cases the

user wants only to react to the loading of a package. This too is not really a simple matter.

Let us take the simple example of loading the package longtable with a KOMA-Script doc-

ument class. The longtable package defines table captions very well suited to the standard

classes, but the captions are totally unsuitable for documents using KOMA-Script and also

do not react to the options of the provided configuration commands. In order to solve this

problem, the longtable package commands which are responsible for the table captions need

to be redefined. However, by the time the longtable package is loaded, the KOMA-Script class

has already been processed.

Until the present, the only way for KOMA-Script to solve this problem was to delay the

redefinition until the beginning of the document with help of the macro \AtBeginDocument.

If the user wants to change the definitions too, it is recommended to do this in the preamble

of the document. However, this is impossible since later at \begin{document} KOMA-Script

will again overwrite the user definition with its own. Therefore, the user too has to delay his

definition with \AtBeginDocument.

Actually, KOMA-Script should not need to delay the redefinition until \begin{document}.

It would be enough to delay exactly until the package longtable has been loaded. Unfortunately,

the L

A

TEX kernel does not define appropriate commands. The package scrlfile provides redress



here.

Likewise, it might be conceivable that before a package is loaded one would like to save the

definition of a macro in a help-macro, in order to restore its meaning after the package has

been loaded. The package scrlfile allows this, too.

The employment of scrlfile is not limited to package dependencies only. Even dependencies

on any other file can be considered. For example, the user can be warned if the not uncritical

file french.ldf has been loaded.

Although the package is particularly of interest for package authors, there are of course



Chapter 13: Control Package Dependencies with scrlfile

332

applications for normal L

A

TEX users, too. Therefore, this chapter gives and explains examples



for both groups of users.

13.2. Actions Prior to and After Loading

scrlfile can execute actions both before and after the loading of files. In the commands used

to do this, distinctions are made made between general files, classes, and packages.

\BeforeFile{file }{instructions }

\AfterFile{file }{instructions }

The macro \BeforeFile ensures that instructions are only executed before the next time



file

is loaded. \AfterFile works in a similar fashion, and the instructions will be executed

only after the file has been loaded. If file is never loaded then the instructions will

never be executed.

In order to implement those features scrlfile redefines the well known L

A

TEX command



\InputIfFileExists

. If this macro does not have the expected definition then scrlfile is-

sues a warning. This is for the case that in future L

A

TEX versions the macro can have a



different definition, or that another package has already redefined it.

The command \InputIfFileExists is used by L

A

TEX every time a file is to be loaded.



This is independent of whether the actual load command is \include, \LoadClass,

\documentclass

, \usepackage, \RequirePackage, or similar. Exceptionally, the command

\input foo

loads the file foo without utilizing \InputIfFileExists. Therefore, one should always use

\input{foo}

instead. Notice the parentheses surrounding the file name!

\BeforeClass{class }{instructions }

\BeforePackage{package }{instructions }

These two commands work in the same way as

\BeforeFile

. The only difference is that the

document class class and the L

A

TEX package package are specified with their names and not



with their file names. That means that the file extensions .cls and .sty can be omitted.

Chapter 13: Control Package Dependencies with scrlfile

333

\AfterClass{class }{instructions }

\AfterClass*{class }{instructions }

\AfterClass+{class }{instructions }

\AfterClass!{class }{instructions }

\AfterAtEndOfClass{class }{instructions }

\AfterPackage{package }{instructions }

\AfterPackage*{package }{instructions }

\AfterPackage+{package }{instructions }

\AfterPackage!{package }{instructions }

\AfterAtEndOfPackage{package }{instructions }

The commands \AfterClass and \AfterPackage work in the same way as

\AfterFile

. The


only difference is that the document class class and the L

A

TEX package package are specified



with their names and not with their file names. That means that the file extensions .cls and

.sty


can be omitted.

The starred versions are a little bit different. They execute the instructions not only at

next time that the class or package is loaded, but also immediately if the class or package has

been loaded already.

The plussed

v3.09


version executes the instructions after loading of the class or package has

been finished. The difference to the starred version is only valid, if loading of the class or

package already started but has not been finished yet. Nevertheless, instructions will be

executed before the instructions of \AtEndOfClass or \AtEndOfPackage when loading of the

class or package has not been finished already.

If a class uses \AtEndOfClass or a package uses \AtEndOfPackage to execute instruc-

tions after the class of package file has been loaded completely, and if you want to execute

instructions

after the instructions of these commands, you may use the exclamation mark

version, \AfterClass!

v3.09


respectively \AfterPackage!.

If you want to do this only in the case the class or package will be loaded later, and if you

want to execute instructions outside the context of the class or package, that will be loaded,

you may use \AfterAtEndOfClass

v3.09

for classes and \AfterAtEndOfPackage for packages.



Example: In the following, an example for class and package authors shall be given. It shows

how KOMA-Script itself employs the new commands. The class scrbook contains:

\AfterPackage{hyperref}{%

\@ifpackagelater{hyperref}{2001/02/19}{}{%

\ClassWarningNoLine{scrbook}{%

You are using an old version of hyperref package!%

\MessageBreak%

This version has a buggy hack at many drivers%

\MessageBreak%

causing \string\addchap\space to behave strange.%

\MessageBreak%


Chapter 13: Control Package Dependencies with scrlfile

334

Please update hyperref to at least version

6.71b}}}

Old versions of the hyperref package redefine a macro of the scrbook class in such

a way that does not work with newer KOMA-Script versions. New versions of

hyperref desist from making these changes if a new KOMA-Script version is de-

tected. For the case that hyperref is loaded at a later stage, therefore, the code in

scrbook verifies that a acceptable hyperref version is used. If not, the command

issues a warning.

At other places in three KOMA-Script classes the following can be found:

\AfterPackage{caption2}{%

\renewcommand*{\setcapindent}{%

After the package caption2 has been loaded, and only if it has been loaded, KOMA-

Script redefines its own command

\setcapindent

. The exact code of the redefini-

tion is not important. It should only be noted that caption2 takes control of the

\caption


macro and that therefore the normal definition of the

\setcapindent

macro would become ineffective. The redefinition improves the collaboration with

caption2.

There are however also useful examples for normal L

A

TEX user. Suppose a document



that should be available as a PS file, using L

A

TEX and dvips, as well as a PDF file,



using pdfL

A

TEX. In addition, the document should contain hyperlinks. In the list of



tables there are entries longer than one line. This is not a problem for the pdfL

A

TEX



method, since here hyperlinks can be broken across multiple lines. However, if a

hyperref driver for dvips or hyperTEX is used then this is not possible. In this case

one desires that for the hyperref setup linktocpage is used. The decision which

hyperref driver to use happens automatically via hyperref.cfg. The file has, for

example, the following content:

\ProvidesFile{hyperref.cfg}

\@ifundefined{pdfoutput}{\ExecuteOptions{dvips}}

{\ExecuteOptions{pdftex}}

\endinput

All the rest can now be left to

\AfterFile

.

\documentclass{article}



\usepackage{scrlfile}

\AfterFile{hdvips.def}{\hypersetup{linktocpage}}

\AfterFile{hypertex.def}{\hypersetup{linktocpage}}

\usepackage{hyperref}

\begin{document}

\listoffigures

\clearpage


Yüklə 2,79 Mb.

Dostları ilə paylaş:
1   ...   27   28   29   30   31   32   33   34   ...   60




Verilənlər bazası müəlliflik hüququ ilə müdafiə olunur ©azkurs.org 2024
rəhbərliyinə müraciət

gir | qeydiyyatdan keç
    Ana səhifə


yükləyin