我目前有一份文件(.tex 源文件),其中我将纸张大小和单面设计定义为类选项。我使用 KOMA-Script 类scrbook
。
A4 格式,可在大学常用打印机上打印并在屏幕上观看
采用 A5 格式进行专业打印(嗯,到目前为止还没有打印出来,但我想尝试一下)
目前,我有一个 TODO 列表,列出当我从 切换到 时需要更改的A4
内容A5
:
* In `GeoTopo.tex`...
* ... replace `a4paper` by `a5paper`,
* ... replace `oneside` by `twoside` and
* ... replace `\usepackage[...]{hyperref}` by `\usepackage{nohyperref}`
* In `titlepage.tex`: replace `10cm` by `4cm`
是否有任何 (La)TeX 解决方案,以便我只需一件事即可获得这些不同的配置?
我认为它可能看起来像这样:
\newcommand{\CompileConfiguration}{A4}
...
\if\CompileConfiguration==A4
\usepackage[...]{hyperref}
\else
\usepackage{nohyperref}
\fi
我最初的想法是让它依赖于纸张大小。但我不知道在这种情况下情况会是什么样子。
更好的解决方案是在 之前定义一个变量\documentclass
。但我以前从未见过\documentclass
except nag
,所以我怀疑这是否可行。特别是,即使对于上面的例子,我也不知道细节。是==
为了比较还是=
?
我见过
\ifundefined
\ifnum
\ifodd
\ifdim
\iftrue
\iffalse
\ifx
所以可能没有字符串比较。但我不知道其他类型\CompileConfiguration
有什么(或者我如何将其定义为布尔值)
答案1
正如 Jon 和 Alex R. 在他们的评论中明确或隐含地写道,这可以通过条件语句很好地完成。我发现您已经加载了包etoolbox
和xifthen
(在后台加载ifthen
)。也可以使用纯 TeX 版本。etoolbox
提供了两种不同的条件,除了 TeX 布尔值之外,还有 LaTeX 切换(更多信息请参阅“布尔标志”下的文档)。我将尝试在这里展示所有三/四个。您使用哪一个,主要取决于您的喜好:
首先定义一个布尔值。这必须尽早完成,至少在第一次使用 之前,见下文。当然,在和 的\KOMAoptions
情况下etoolbox
xifthen
情况下,必须先加载包。请注意,对于 TeX 标志,两个包都在后台定义纯 TeX 布尔值,因此将以下所有内容放在一个文件中将产生错误。
% pure TeX
\newif\ifAFive
% (x)ifthen
\newboolean{AFive}
% etoolbox TeX flag
\newbool{AFive}
% etoolbox LaTeX flag
\newtoggle{AFive}
现在将第一行更改为
\documentclass[DIV15,BCOR12mm]{scrbook}
然后在序言中的某个地方(再次:在包加载之前etoolbox
和xifthen
之后)添加以下内容:
% pure TeX
\ifAFive
\KOMAoptions{paper=a5,twoside=true}
\else
\KOMAoptions{paper=a4,twoside=false}
\fi
% (x)ifthen
\ifthenelse{\boolean{AFive}}{
\KOMAoptions{paper=a5,twoside=true}
}{
\KOMAoptions{paper=a4,twoside=false}
}
% etoolbox TeX flag
\ifbool{AFive}{
\KOMAoptions{paper=a5,twoside=true}
}{
\KOMAoptions{paper=a4,twoside=false}
}
% etoolbox LaTeX flag
\iftoggle{AFive}{
\KOMAoptions{paper=a5,twoside=true}
}{
\KOMAoptions{paper=a4,twoside=false}
}
您可以在此处轻松添加选项。此软件包提供了在软件包加载后更改或添加选项的hyperref
命令。因为我怀疑您只想停用打印的彩色链接,所以我建议您使用选项。在加载后添加它,您可能有一个选项(我只显示两个版本,其他版本应该从上面清楚):\hypersetup
hidelinks
hyperref
colorlinks
% pure TeX
\ifAFive
\hypersetup{hidelinks=true}
% no \else branch needed in this case
\fi
% (x)ifthen
\ifthenelse{\boolean{AFive}}{
\hypersetup{hidelinks=true}
}{} % the part for Boolean=false is left empty
如果您确实想加载nohyperref
,则只需替换该\hypersetup
行即可。您可以将其与上面的条件调用合并,只要将它们放在所有需要的包之后即可。
稍后,在 A4 格式的命令行上,您无需更改任何内容(如果没有明确设置为 true,则布尔值和切换为 false)。对于 A5 格式,您现在可以进行编译(在 Windows 中使用双引号,在 Linux 和 MacOSX 中将其替换为单引号):
当您使用纯标志时:
pdflatex "\AFivetrue\input{GeoTopo.tex}"
当您使用该
(x)ifthen
版本时:pdflatex "\setboolean{AFive}{true}\input{GeoTopo.tex}"
当您使用
etoolbox
TeX 标志时:pdflatex "\setbool{AFive}{true}\input{GeoTopo.tex}"
当您使用
etoolbox
LaTeX 标志时:pdflatex "\settoggle{AFive}{true}\input{GeoTopo.tex}"
。
因为etoolbox
还有\booltrue{AFive}
相应的变体\toggletrue{AFive}
。
编辑:我忘了titlepage.tex
。
我将把这个短文件的命令合并到主文件中。\vspace
我确信标题定义里面是错误的。您需要一个空行或一个\par
空行,但(没有重新测试)我猜您会在标题中得到一个错误。使用 newline 命令的可选参数,\\[10cm]
或者,因为我们想要更改这一点:
在序言中的某处定义新的长度
\newlength{\timgskip} % from "title image skip"
然后再次在条件中(这次只显示纯版本):
\ifAFive
\setlength{\timgskip}{4cm}
\else
\setlength{\timgskip}{10cm}
\fi
这也可以合并,只要它是在新的长度定义之后设置的。
现在相应的行必须看起来像这样:
\title{Geometrie und Topologie\\[\timgskip]
答案2
您可以做这样的事情(但请注意,我不使用 KOMA 类,所以我不熟悉所有与页面相关的选项):
\newif\ifaiv
%\aivtrue % default is \aivfalse
% pre-\documentclass usage
\ifaiv
\def\pagedim{a4paper}
\else
\def\pagedim{paper=A5}
\fi
\documentclass[\pagedim]{scrbook}
\usepackage[T1]{fontenc}
% in-preamble usage
\ifaiv
\usepackage[colorlinks]{hyperref}
\else
\usepackage[hidelinks]{hyperref}
\fi
\def\thepagedim{The page is set to \pagedim}
\begin{document}
\thepagedim
\end{document}