我在研讨会上使用 Beamer 演示文稿,我会设置问题,让学生思考答案,然后展示一些示例答案。我给学生一个没有答案的演示文稿版本,这样他们就可以根据需要回顾演示文稿。
在 LaTeX 中执行此类条件处理的常用方法似乎是定义一个命令来标记答案,然后提供该命令的两个定义,一个包含答案,另一个省略答案。在这些定义之间切换的常用方法是使用不同的顶级源文件。
我希望避免为每个演示文稿创建额外的顶级源文件,而是使用命令行参数、环境变量或类似的东西来控制格式化行为。然后我可以编写一个脚本来格式化演示文稿两次,一次带有答案,一次不带答案。
透过pdflatex 的参数,我没有看到传递可在 LaTeX 源中使用标志来在定义之间进行选择的方法。
相关问题及解决方法:
答案1
命令行被视为 Tex 源代码,除非它仅由字母组成,在这种情况下它被视为具有隐式\input
所以你可以
pdflatex '\def\opta{1} \def\optb{yes} \input{file}'
并在测试主体中,和file.tex
的值。您可能需要不同的引号字符,或者根据您使用的命令行 shell 使用代替。\opta
\optb
\\
\
答案2
在我的系统上,我将以下示例保存为测试.tex并在 shell 上(通过chdir
或cd
或其他方式)将活动目录更改为目录测试.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}