版權聲明:本文為部落客chszs的原創文章,未經部落客允許不得轉載。 https://blog.csdn.net/chszs/article/details/1301459
LaTeX2e類和包的設計 (二)
繼續說明如何編寫class和package。
二、類和包書寫指令
1) 檔案辨別指令
/NeedsTeXFormat{format-name}[release-date]
此指令告訴TeX,本檔案由format-name格式的TeX系統進行處理。
release-date用來指定使用格式的版本日期。
/ProvidesClass{class-name}[release-info]
/ProvidesPackage{package-name}[release-info]
表示本檔案包含文檔類class-name和包package-name的定義。
release-info表示類或包的說明資訊。格式如下:
(1)包版本日期yyyy/mm/dd;
(2)說明文字,可包括版本号。
可通過/listfiles指令顯示release-info的資訊。
/ProvidesFile{file-name}[release-info]
file-name必須為檔案全名,包括擴充名;此指令用來聲明除主類和封包件以外的檔案。
2)檔案裝入指令
在類或封包件中裝入别的包:
/RequirePackage[options-list]{package-name}[release-info]
/RequirePackageWithOptions{package-name}[release-info]
/LoadClass[options-list]{class-name}[release-info]
/LoadClassWithOptions{class-name}[release-info]
每個類檔案中最多隻能使用一次,且隻能在類檔案中使用。
3)可選項聲明指令
/DeclareOption{option-name}{code}
使option-name變成所在包或類的一個可選項;code參數是當使用者使用了該可選項時要執行的代碼,可包含任何合法的LaTeX2e結構。
/DeclareOption*{code}
設定“預設可選項代碼”,指當使用者使用的可選項在類或包中沒有顯式聲明時,系統執行該指令的code參數。code參數可以包含任何合法的LaTeX2e結構。
4)可選項代碼中使用的指令
在code參數中使用的指令:
/CurrentOption
代表使用者指定的目前可選項
/OptionNotUsed
将使用者指定的目前可選項添加到“未使用可選項”清單。
/PassOptionsToPackage{options-list}{package-name}
将optons-list參數中列出的可選項(不止一個時用逗号隔開)傳遞給包package-name,即此後的/RequirePackage或/usepackage指令可以使用的可選項中包含了option-list中的可選項。
/PassOptionsToClass{options-list}{class-name}
注:
/RequirePackageWithOptions指令同/RequirePackage指令相似,但前者在裝入指定的包時所使用的可選項清單總是同目前類或包打開時所使用的可選項清單完全相同,而不使用明确給出或由/PassOptionsToPackage指令傳遞來的可選項。
/LoadClassWithOptions的主要目的是允許一個類簡單地繼承别的類的特性,如指令/LoadClassWithOptions{article}同控制序列:
/DeclareOption*{/PassOptionsToClass{/CurrentOption}{article}}
/ProcessOptions/relax
/LoadClass{article}
的作用相同,但使用/LoadClassWithOptions指令要簡單得多,執行也快些。如果類聲明了自己的可選項,則兩者的差別就大了。如:
(1)
/DeclareOption{landscape}{/@landscapetrue}
/ProcessOptions/relax
/LoadClassWithOptions{article}
(2)
/DeclareOption*{/PassOptionsToClass{/CurrentOption}{article}}
/LoadClass{article}
序列(1)很好;序列(2)中article被裝入時根本接收不到landscape可選項,因為隻有預設的可選項傳遞給了article,而landscape是有顯示聲明的可選項,不在傳遞之列。
5)代碼延遲執行指令
/AtEndOfClass{code}
/AtEndOfPackage{code}
主要用于/DeclareOption或/DeclareOption*指令的參數中間,将code代碼暫時内部儲存,等到目前類或包處理完畢後再執行code代碼。指令可多次使用。
/AtBeginDocument{code}
/AtEndDocument{code}
/AtBeginDocument指令将code代碼暫時内部儲存,等到LaTeX執行/begin{document}和/end{document}指令時再執行。
/AtEndDocument指令的code參數将在/end{document}指令開始執行、最終頁面尚未完成、剩下的可浮動環境還沒有處理的時候得到執行。如果code中的某些代碼需要在頁面和可浮動環境都已經完成排版任務之後才執行,那麼這些代碼之前必須插入一條/clearpage指令。
/AtBeginDvi{specials}
此指令将specials參數儲存在一個注冊盒子裡并寫入.dvi檔案中文檔首頁輸出開始處。參數中不能帶任何排版内容進入.dvi檔案。指令可多次使用。
6)可選項處理指令
/ProcessOptions
将執行每個使用的可選項在聲明時設定的處理代碼。在類檔案和封包件中的執行過程和結果略有不同。
可選項分兩種:局部可選項和全局可選項。
局部可選項:指那些在/PassOptionsToPackage{options}指令、/usepackage[options]指令或/RequirePackage[options]指令的options參數中明确指定的可選項。
全局可選項:指使用者在/documentclass[options]指令的options參數中指定的,除了局部可選項之外的所有可選項。
(1)在封包件中使用
(2)在類檔案中使用
在類檔案中使用同在封包件中,隻是所有的可選項都當作局部可選項,另外/DeclareOption*的預設值是/OptionNotUsed而不是出錯。
/ProcessOptions*/@options
執行過程同/ProcessOptions,但是可選項的處理順序不是按照在類或包中的聲明順序進行,而是由指令調用時的options參數指定。
/ExceuteOptions{options-list}
options-list參數的每個可選項,按照順序依次執行一下/ds@option指令。使用這條指令可在緊靠/ProcessOptions指令前面的地方提供一個“預設可選項清單”。
7)檔案操作指令
/IfFileExists{file-name}{true}{false}
檢測一個檔案是否存在。存在則執行true參數給出的代碼;不存在則執行false參數給出的代碼。
/InputIfFileExists{file-name}{true}{false}
如果file-name檔案存在,将執行true參數給出的代碼并馬上裝入該檔案;如果不存在,則執行false參數給出的代碼。
8)報告錯誤指令
/ClassError{class-name}{error-text}{help-text}
/PackageError{package-name}{error-text}{help-text}
用來産生錯誤資訊,出錯時将顯示error-text參數給出的錯誤資訊以及?提示符,如果使用者敲擊h鍵,系統将顯示help-text參數指定的幫助文本。在errror-text和help-text參數中,可以使用/protect指令來終止目前出錯指令的進一步展開;可以使用/MessageBreak指令使顯示内容換行;使用/space指令輸出空格。
如:
/newcommand{/foo}{FOO}
/PackageError{ethel}{%
Your hovercraft is full of eels,/MessageBreak
and /protect/foo/space is /foo
}{%
Oh dear! Someting's gone wrong. /MessageBreak
/space /space Try typing /space <return>
/space to proceed, igoring /protect/foo.
}
将産生如下的輸出結果:
!Package ethel Error: Your hovercraft is full of eels,
(ethel) and /foo is FOO.
See the ethel package documentation for explanation.
按下h鍵,再顯示:
Oh dear! something's gone wrong.
Try typing <return> to proceed, ignoring /foo.
/ClassWarning{class-name}{warning-text}
/PackageWarning{package-name}{warning-text}
/ClassWarningNoLine{class-name}{warning-text}
/PackageWarningNoLine{package-name}{warning-text}
在螢幕上顯示warning-text參數所給的警告資訊:其中,第1、2條将顯示警告發生處的行号,而第3、4條指令不顯示行号。
/ClassInfo{class-name}{info-text}
/PackageInfo{package-name}{info-text}
将info-text參數所給資訊寫進log檔案(包括行号)。
在warning-text和info-text參數中,可使用/protect指令來終止目前出錯指令的進一步展開,可使用/MessageBreak指令使顯示内容換行,使用/space指令輸出空格。
9)定義牢固指令
牢固指令:指該指令可以作為其它指令的參數使用,而前面無需使用/protect字首指令。
/DeclareRobustCommand{cmd}[num][default][definition]
/DeclareRobustCommand*{cmd}[num][default][definition]
使用這兩個指令既可以定義新指令,也可以重新定義已有的指令。
/DeclareRobustCommand{/seq}[2][n]{%
/ifmmode
#1_{1}/ldots#1_{#2}%
/else
/PackageWarning{fred}{You can't use /protect/seq/space in text}%
/fi
/CheckCommand {cmd}[num][default]{definition}
/CheckCommand*{cmd}[num][default]{definition}
檢查cmd指令的目前定義是否未definition參數所給出的那樣,如果不同,導緻出錯。
10)其它雜類指令
布局參量
/paperheight
/paperwidth
紙張的實際尺寸,而不象/textwidth和/textheight指令那樣隻是标注内部主文檔區的大小。
大小寫字元轉換指令
/uppercase{text}
/lowercase{text}
實作字母的大小寫轉換。不能轉換由某些指令(如/ae或/aa)産生的特殊字元。
解決這個問題,用以下指令:
/MakeUppercase{text}
/MakeLowercase{text}