是否可以让 \usepackage 依赖于纸张尺寸?

是否可以让 \usepackage 依赖于纸张尺寸?

我目前有一份文件(.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。但我以前从未见过\documentclassexcept nag,所以我怀疑这是否可行。特别是,即使对于上面的例子,我也不知道细节。是==为了比较还是=

我见过

\ifundefined
\ifnum
\ifodd
\ifdim
\iftrue
\iffalse
\ifx

所以可能没有字符串比较。但我不知道其他类型\CompileConfiguration有什么(或者我如何将其定义为布尔值)

答案1

正如 Jon 和 Alex R. 在他们的评论中明确或隐含地写道,这可以通过条件语句很好地完成。我发现您已经加载了包etoolboxxifthen(在后台加载ifthen)。也可以使用纯 TeX 版本。etoolbox提供了两种不同的条件,除了 TeX 布尔值之外,还有 LaTeX 切换(更多信息请参阅“布尔标志”下的文档)。我将尝试在这里展示所有三/四个。您使用哪一个,主要取决于您的喜好:

首先定义一个布尔值。这必须尽早完成,至少在第一次使用 之前,见下文。当然,在和 的\KOMAoptions情况下etoolboxxifthen情况下,必须先加载包。请注意,对于 TeX 标志,两个包都在后台定义纯 TeX 布尔值,因此将以下所有内容放在一个文件中将产生错误

% pure TeX
\newif\ifAFive

% (x)ifthen
\newboolean{AFive}

% etoolbox TeX flag
\newbool{AFive}

% etoolbox LaTeX flag
\newtoggle{AFive}

现在将第一行更改为

\documentclass[DIV15,BCOR12mm]{scrbook}

然后在序言中的某个地方(再次:在包加载之前etoolboxxifthen之后)添加以下内容:

% 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命令。因为我怀疑您只想停用打印的彩色链接,所以我建议您使用选项。在加载后添加它,您可能有一个选项(我只显示两个版本,其他版本应该从上面清楚):\hypersetuphidelinkshyperrefcolorlinks

% 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}"

  • 当您使用etoolboxTeX 标志时:

    pdflatex "\setbool{AFive}{true}\input{GeoTopo.tex}"

  • 当您使用etoolboxLaTeX 标志时:

    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}

相关内容