LaTeX教程(002)-LaTeX文档结构(02)

本文介绍了LaTeX中askinclude包的交互式文件包含功能,以及如何使用tagging包实现文档中的变体管理和标签控制。特别强调了局部编译时.aux文件的重要性和tagging包的使用技巧。
摘要由CSDN通过智能技术生成

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。如果我们想要编译的是chapter01chapter02,那么我们可以输入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紧跟其后的地方如果放了其他文本,那么在这个环境被隐藏的时候,这些文本也会被隐藏,应当小心这一特性。

关注【年轻人 你渴望力量么】

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值