我正在为一个有两个版本的软件编写文档。除了一些具体细节外,文档中的大部分内容都相同。现在,我正在使用条件语句为特定文件构建文档,如下所示,
\usepackage{etoolbox}
..
\newtoggle{version5}
\togglefalse{version5}
\iftoggle{version5} {
\title{Version 5 document}
} {
\title{Version 6 document}
}
\begin{document}
\chapter{Chapter 1}
\iftoggle{version5} {
\section{Version 5 section}
} {
\section{Version 6 section}
}
\end{document}
这很完美,但问题是每次我需要其中一个文档toggle
时,我都需要变量。有没有办法在一次运行中构建两个文档?
答案1
这将使用shell-escape
功能(\immediate\write18
)并将\togglefalse{version5}
或写入\toggletrue{version5}
名为foo.cfg
这foo.cfg
是由 读的foo.tex
。
编译是在子 shell 中完成的,重命名可以通过--jobname=
二进制选项pdflatex
(或xelatex
等)来完成。
\documentclass{article}
\newwrite\foocfg% Get a file handle
\newcommand{\prepareconfigfile}[2]{%
\immediate\openout\foocfg=#1 % open the file in #1 -- Be carefull here!
\immediate\write\foocfg{%
\expandafter\string\csname toggle#2\endcsname{version5}%
}%
\immediate\closeout\foocfg% Close the file
}
\begin{document}
\prepareconfigfile{foo.cfg}{true}
\immediate\write18{pdflatex --jobname=footrue.pdf foo}
\prepareconfigfile{foo.cfg}{false}
\immediate\write18{pdflatex --jobname=foofalse.pdf foo}
\end{document}
编译源 ( foo.tex
)
\documentclass{book}
\usepackage{etoolbox}
\newtoggle{version5}
\togglefalse{version5}
\InputIfFileExists{foo.cfg}{}{}
\iftoggle{version5}{%
\title{Version 5 document}
}{%
\title{Version 6 document}
}
\begin{document}
\maketitle
\chapter{Chapter 1}
\iftoggle{version5}{%
\section{Version 5 section}
}{%
\section{Version 6 section}
}%
\end{document}
答案2
正如我在评论中提到的那样,这个问题向文档传递参数已经指向正确的方向。
文件主文件.tex
\documentclass{scrbook}
\usepackage{etoolbox}
\usepackage{xstring}
\newtoggle{version5}
\IfStrEq{\jobname}{\detokenize{Version5}}{\toggletrue{version5}}{\togglefalse{version5}}
\iftoggle{version5} {
\title{Version 5 document}
} {
\title{Version 6 document}
}
\begin{document}
\chapter{Chapter 1}
\iftoggle{version5} {
\section{Version 5 section}
} {
\section{Version 6 section}
}
\jobname
\end{document}
之后,您可以添加一个(或两个)符号链接。一个名为 Version5.tex,另一个名为 Version6.tex。这甚至可以在 Windows 下工作(但需要命令行或批处理文件和管理员权限;如果需要,我可以提供批处理文件)。
答案3
这是另一种基于文件名的解决方案。创建一个文件Master.tex
和两个指向它的符号链接:Version5.tex
和Version6.tex
。编译其中一个时,如果正在编译,则将开关versionV
设置为 true ,否则设置为 false。Version5
我使用了更低级别的版本\newif
来创建开关并\ifversionV
根据其值进行分支。无需额外的软件包。
\documentclass{article}
\newif\ifversionV
\makeatletter
\edef\@tempa{\jobname}
\def\@tempb{Version5}
\@onelevel@sanitize\@tempb
\ifx\@tempa\@tempb \versionVtrue\else\versionVfalse\fi
\makeatother
\ifversionV
\title{Version 5}
\else
\title{Version 6}
\fi
\author{Franz K.}
\begin{document}
\maketitle
One morning, as Gregor Samsa was waking up from anxious dreams, he
discovered that in his bed he had been changed into a monstrous verminous
bug. He lay on his armour-hard back and saw, as he lifted his head up a
little, his brown, arched abdomen divided up into rigid bow-like sections.
\end{document}