在一次构建中生成不同文档版本的多个 PDF

在一次构建中生成不同文档版本的多个 PDF

我正在为一个有两个版本的软件编写文档。除了一些具体细节外,文档中的大部分内容都相同。现在,我正在使用条件语句为特定文件构建文档,如下所示,

\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 下工作(但需要命令行或批处理文件和管理员权限;如果需要,我可以提供批处理文件)。

此后,您可以编译 Version5.tex 和 Version6.tex 并得到以下输出: 版本5 版本6

答案3

这是另一种基于文件名的解决方案。创建一个文件Master.tex和两个指向它的符号链接:Version5.texVersion6.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}

相关内容