LaTeX教程(002)- LaTeX \LaTeX LATEX文档结构(02)
2.1.5 askinclude
-管理你的包含文件
askinclude
包(由Pablo Straub和Heiko Oberdiek创建)让我们在编译时可以交互式地选择要包含的文件。由于它需要交互,因此你在一些配置好的编辑器中直接编译可能会报错。我们建议命令行中编译。现在,我们来演示一下它的作用。我们需要创建三个文件:
%创建第一个文件chapter01.tex
\chapter{this is chapter one}
一
\kant[1] %用来生成一段伪文本,我们以后会经常用到
%创建第二个文件chapter02.tex
\chapter{this is chapter two}
二
\kant[2]
%创建第三个文件,也是主文件main.tex
\documentclass{book}
\usepackage{ctex}
\usepackage[makematch]{askinclude}
\usepackage{kantlipsum} %用来生成伪文本的包
\begin{document}
\include{chapter01}
\include{chapter02}
\end{document}
三个文件创建完成,我们编译主文件main.tex。注意用命令行: 首先用cd
跳转到源文件所在的文件夹,然后输入:
xelatex preamble.tex
由于我们调用了askinclude
包,命令行窗口中会给出一些交互选项。把前面的内容忽略,有用的内容大概如下:
***********************************
*** Package askinclude Question ***
***********************************
Files, found by previous run in \include:
(+) chapter01
(-) chapter02
Previous answer (makematch):
[chapter01]
Regular expressions:
[noregexp] disabled
--> [makematch] enabled, using package `makematch'
Which files do you want to include?
[foo,bar] comma separated file or pattern list
[*] all files
[-] no files
[?] ask for each file
[] use the previous answer
\answer=
我们要做的是在最后一行的\answer=
后面给出交互信息。在这之前,我们先认识一下这些字符中有哪些信息。第5-7行指出了上一次运行中,哪些文件被编译了,哪些文件没有编译。+
表示编译了,-
表示未编译。
(+) chapter01
(-) chapter02
表示上一次运行,编译了chapter01.tex,而没有编译chapter02.tex。
9-10行指出了上一次给出的交互信息,也就是我们上一次在\answer=
后面给出的答案,上一次我们给出的是chapter01。
12-14指出我们开启了哪种匹配模式,我们调用包askinclude
的时候添加了选项makematch
,因此这里显示[makematch] enabled
。这个选项的作用我们接下来讲。
16行是说,我们可以利用下列选项来确定编译哪些文件。17-21行列出了我们可以提交的信息的形式。
17行: 提交一个列表,这个列表就是我们要处理的文件列表,文件名称与名称之间用逗号隔开。例如,我们想要编译的是chapter01
,我们就可以在\answer=
后面输入chapter01
。如果我们想要编译的是chapter01
和chapter02
,那么我们可以输入chapter01,chapter02
。注意不管哪种方式,中括号([ ])都是不用输入的。makematch
的作用是为文件列表提供一种匹配模式,这种模式中,星号"*"是一种通配符,我们如果输入是的cha*
,那么它会匹配所有以cha开头的文件名称,包括chapter01和chapter02,如果我们有一个chat文件,也会被包含。星号可以放在任何位置,可以放在前面,如,输入*01
可以匹配所有以01结尾的文件名称。也可以放中间,如ch*01
可以匹配所有以ch开头、以01结尾的文件名称,中间可以是任何内容。!
的作用是排除,我们在某个名称前面加上!
,即可排除这个文件。例如,我们输入cha*,!chapter02
,就可以匹配所有以cha开头的文件,但是chapter02除外。在文件特别多,但又有个别文件不需要编译时,使用它很方便。
要注意,在文件列表中,不管是星号*
还是!
,都要开启makematch
选项才能生效。
输入完成后,按回车键(enter),会继续编译,直至完成输出。
18行: 输入星号*
,回车,编译所有的文件,输出结果。
19行: 输入减号-
,回车,所有文件都不编译,输出结果。
20行: 输入问号?
,则会对每一个文件询问是否编译。输会该选项之后回车,并不会立刻输出结果,而是会有新的交互信息。在当前的例子中,假设我们输入的是?
,那么接下来会弹出如下信息:
***********************************
*** Package askinclude Question ***
***********************************
Include `chapter01'? [y]es, [n]o, [A]ll, [N]one, [D]efault (y):
\answer=
系统询问我们,是否包括(编译)chapter01? 这一次我们可以输入y
,表示是(yes),或者输入n
,表示否(no)。如果我们选择的是这两个中的一个,那么接下来就会弹出下一个提示,即是否包括(编译)chapter02? 以此类推,直到最后一个。如果对某一个文件,我们选择的是A
,即所有(ALL),那么从当前文件到最后一个文件均被编译(而前面已经设置好的选项不会变化),同时后面的文件均不再询问。N
表示都不(None),即从当前文件到最后一个文件均不编译,同时后面的文件均不再询问。D
表示默认(Default),默认情况下,遵循上一次运行时的选择。选择了D
,即表示从当前文件到最后一个文件是否编译都按照上一次的选择。在所有文件都确认后,输出结果。
21行: 什么都不输入,直接按回车,按照上次的选择编译,即,重复上一次运行的选项,输出结果。
局部编译应当小心,不管是用\includeonly
还是用askinclude
。尤其应当小心.aux
文件是否完整,以及是否是新的。例如,在我们编译chapter02时,如果我们上一次编译生成的chapter02.aux文件还在(正常情况下都不会消失),那么系统会直接读取该文件。如果我们的chapter02.aux文件丢失了,那么编译时会产生的新的chapter02.aux文件。但是要注意,新的文件中有相当多的内容(尤其是计数器)的正确性,是以前面编译的文件(chapter01.aux)的计数器为基础的。在我们只编译chapter02时,系统先读取到chapter01.aux,知道这才是第一章,那么哪怕我们只编译chapter02,它也知道这是第二章,它会为标题选取正确的编号。
最糟糕的情形是当前要编译的文件的.aux文件丢失了,前面的文件的.aux文件也丢失了。例如,我们误删了chapter02.aux,并且也误删了chapter01.aux,那么如果我们只编译chapter02,就不会生成chapter01.aux。由于没有了原来第一章的计数,计数器会从chapter02开始,生成一个chapter02.aux,并把第二章错当成是第一章。
因此,我们应当注意的是,局部编译时不要轻易删除.aux
文件,除非你清楚自己在做什么。如果所要编译的文件前面的.aux
文件丢失了或者发生了变动,那么最好将整个文档重新编译。
2.1.6 tagging
-在源文件中提供变体
有时候我们需要将多个版本的文档放在单个源文件中,特别是当大部分文本在多个不同版本之间共享的时候。Brent Longborough 提供了可以实现该功能的包。
这个允许我们使用一些命令给不同的文本做相同或不同的标记,然后选择某个(或某些)标签作为tagging
包的选项,就可以激活对应的标签,从而可以显示或隐藏标签对应的文本。我们选用一个简单的例子演示一下它的工作原理:
\documentclass{book}
\usepackage{ctex}
\usepackage[doc]{tagging} %选项中是要被激活的标签。
\begin{document}
\tagged{doc}{doc被激活了} %从导言区中可以看到,被激活的标签是doc,因此在输出结果中会有"doc被激活了"这句话。
\tagged{code}{code被激活了} %code标签并没有被激活,因此这句话不会显示。
\end{document}
在输出的文档中只有一行文本:
doc被激活了
可以看到,我们在调用tagging
包的选项中输入的选项,就是我们要激活的标签,正文中被该标签标记的文件就会得到相应的处理。
现在我们详细介绍一下该包所提供的命令。
首先是\usepackage[label-list]{tagging}
,注意,选项之所以是label-list
(标签列表)是因为可以同时激活多个标签,标签之间用逗号隔开。
\tagged{label-list}{text}
: \tagged
命令用一个或多个标签标记一段文本。标签列表中,只要至少有一个标签被激活,就会输出text,否(所有标签都未被激活)则隐藏text。
\untagged{label-list}{text}
: \untagged
与\tagged
相反,标签列表中,只要至少有一个标签被激活,就会隐藏text,所有标签都不被激活时,输出text。
\iftagged{label-list}{text01}{text02}
: 它将\tagged
与\untagged
相结合,在标签列表中,如果至少有一个标签被激活,则输出text01,否(所有标签都不被激活)则输出text02。
\usetag{label-list}
: 在正文中使用,它可以将列表中所有的标签激活。
\droptag{label-list}
: 在正文中使用,它可以将列表中所有的标签取消激活。
另外,text可以是命令。
现在,我们再用一个稍复杂的例子演示一下这些功能:
%创建文件chapter01.tex
这是chapter01中的文本,用来放置文档(doc)
%创建文件chapter02.tex
这是chapter02中的文本,用来放置代码(code)
%创建主文件main.tex
\documentclass{book}
\usepackage{ctex}
\usepackage[doc,nothing]{tagging}
\usepackage{kantlipsum}
\begin{document}
\tagged{doc}{doc标签被激活了}
\tagged{doc,code}{doc标签和code标签至少有一个被激活了}
\tagged{code}{code标签被激活了}
\tagged{doc}{\kant[1]}
\untagged{doc,code}{doc和code标签全都没有被激活}
\untagged{code,other}{code和other标签全都没有被激活}
\untagged{code}{code标签没有被激活}
\iftagged{doc}{\input{chapter01}}{doc标签没有被激活}
\iftagged{code}{\input{chapter02}}{code标签没有被激活}
\usetag{code,other} %激活code和other标签
\droptag{doc,nothing} %取消激活doc,noting标签
\tagged{doc}{doc标签被激活了}
\tagged{code}{code标签被激活了}
\tagged{}{空标签被激活了}
\untagged{}{空标签始终不会被激活} %不管激活了哪些标签,甚至不管有没有标签被激活,空标签始终都不被激活。
\end{document}
我们可以得到如下输出
请确保自己理解了为什么这段代码会输出这样的内容。
前面我们说这些text参数可以是命令,但有一些限制,例如不能是\verb
命令。
\verb
: 我们知道
LaTeX
\LaTeX
LATEX是一门标记语言,简单地说,它可以将一些字符编译成样式(这一点我们从前面的例子中都能看出来)。有些时候,我们想让字符原样显示出来,而不进行这样的转换,就可以使用\verb
命令。例如,一般情况下,
LaTeX
\LaTeX
LATEX会将字符串\LaTeX
编译成
LaTeX
\LaTeX
LATEX,而如果我们将\LaTeX
作为\verb
的参数,就可以原样输出。
\verb
命令用一对竖线(|text|)或者等于号(=text=)来包括它的参数,例如,我们在正文中输入:
\LaTeX
\verb|\LaTeX|
\verb=\chapter{one}=
就会得到
但是如果我们在tagging
包提供的这几个命令中使用\verb
作为参数,如\tagged{doc}{\verb|text|}
就会报错。
另外,这类命令处理短文本很有用,如果要处理长文本,最好还是将它放入一个单独的文件中,然后再在某个tagging
提供的命令中放入包含该文件的命令(如\tagged{doc}{\input{chapter01}}
,就像我们前面演示的那样)。
另一种方法是使用taggedblock
环境或者untaggedblock
环境。 taggedblock
环境相当于\tagged
的功能,而untaggedblock
环境相当于\untagged
的功能。我们用一个例子演示一下:
\documentclass{book}
\usepackage{ctex}
\usepackage[doc]{tagging}
\begin{document}
环境中可以使用{\tt\textbackslash verb}命令,
\begin{taggedblock}{doc}
例如\verb|\LaTeX|,\verb|#&|等等
\end{taggedblock}
。注意这个句号的位置,end所在的那一行后面不应当放其他文本,否则在该标签标记的文本被隐藏的时候,后面的这部分文本也会随之消失,例如:
\begin{untaggedblock}{doc}
这段话不会显示
\end{untaggedblock}放在后面的这句话也不会显示
\end{document}
这段代码输出结果是:
应当注意的是,begin后面的空格会被忽略,实际上,代码中的单个换行和缩进都是空格,但是并不会出现在输出结果中。
另外,环境中的内容中间插入的空格,会被保留到输出结果中,而且,这两个环境中可以使用\verb
命令。
最后,end紧跟其后的地方如果放了其他文本,那么在这个环境被隐藏的时候,这些文本也会被隐藏,应当小心这一特性。
关注【年轻人 你渴望力量么】