通过命令行参数进行 LaTeX 条件处理

通过命令行参数进行 LaTeX 条件处理

我在研讨会上使用 Beamer 演示文稿,我会设置问题,让学生思考答案,然后展示一些示例答案。我给学生一个没有答案的演示文稿版本,这样他们就可以根据需要回顾演示文稿。

在 LaTeX 中执行此类条件处理的常用方法似乎是定义一个命令来标记答案,然后提供该命令的两个定义,一个包含答案,另一个省略答案。在这些定义之间切换的常用方法是使用不同的顶级源文件。

我希望避免为每个演示文稿创建额外的顶级源文件,而是使用命令行参数、环境变量或类似的东西来控制格式化行为。然后我可以编写一个脚本来格式化演示文稿两次,一次带有答案,一次不带答案。

透过pdflatex 的参数,我没有看到传递可在 LaTeX 源中使用标志来在定义之间进行选择的方法。

相关问题及解决方法:

答案1

命令行被视为 Tex 源代码,除非它仅由字母组成,在这种情况下它被视为具有隐式\input

所以你可以

pdflatex '\def\opta{1} \def\optb{yes} \input{file}'

并在测试主体中,和file.tex的值。您可能需要不同的引号字符,或者根据您使用的命令行 shell 使用代替。\opta\optb\\\

答案2

在我的系统上,我将以下示例保存为测试.tex并在 shell 上(通过chdircd或其他方式)将活动目录更改为目录测试.tex存储,然后编译测试.tex通过调用latexmk通过 shell/命令行

latexmk -cd -gg -pdflatex="lualatex --shell-escape %O %S" -pdf 测试.tex

(也许在你的平台上你需要的--enable-write18是 而不是--shell-escape

,然后在第一个路拉泰克斯-run 发起者latexmk,其中辅助文件在开始时不存在,另一个latexmk-run 启动,其中-jobname-option 用于将短语附加_WithAnswers到 的当前扩展\jobname

无论如何,都会检查\jobname-primitive的扩展是否包含短语_WithAnswers

如果是的话,开关\ifWithAnswers设置为“真”。

如果不是,则开关\ifWithAnswers设置为“false”。

因此你有一个latexmk-运行测试.tex恰好一次引发另一次latexmk-运行测试.tex-jobname="test_WithAnswers"

最后你得到测试.pdf没有答案,测试_WithAnswers.pdf附有答案。

%=======================================================================================================
\ExplSyntaxOn
\cs_new:Npn \CheckWhetherJobnameContainsPhrase #1 {
  \exp_args:Nne \use:nn {\str_if_in:nnTF} {{\jobname} {#1}}
}
\ExplSyntaxOff

\newif\ifWithAnswers

\CheckWhetherJobnameContainsPhrase{_WithAnswers}{%
  %----------------------------------------------------------------------------
  % Stuff in case the document is to be created with answers
  %............................................................................
  \WithAnswerstrue
}{%
  %----------------------------------------------------------------------------
  % Stuff in case the document is to be created without answers
  %............................................................................
  % - Let's call another instance of latexmk for creating the document-variant
  %   with answers:
  %............................................................................
  %  (Let's do things when the.aux-files are already read.)
  \AtBeginDocument{%
    \immediate\write\csname @mainaux\endcsname{\string\providecommand\string\DoOnlyInFirstLaTeXRun[1]{}}%
    \providecommand\DoOnlyInFirstLaTeXRun[1]{#1}%
    \DoOnlyInFirstLaTeXRun{%
      \RequirePackage{shellesc}% more recent releases of LuaTeX don't provide
                               % \write18 any more. This package makes sure
                               % under such LuaTeX \write18 is emulated by
                               % calls to \directlua.
      \ShellEscape{%
        latexmk -cd
                -jobname="\jobname\string_WithAnswers"
                -pdflatex="lualatex \csname @percentchar\endcsname O \csname @percentchar\endcsname S"
                -pdf
                \jobname.tex
      }%
    }%
  }%
  %............................................................................
  \WithAnswersfalse
}
%=======================================================================================================

\documentclass{article}

\begin{document}

  This is a text.

  \ifWithAnswers 
    It comes with answers.
  \else
    It comes without answers.
  \fi

\end{document}

相关内容