我经常用 Beamer 创建演示文稿,需要讲义和演示文稿本身。为了避免在需要编译另一个文件时编辑文件,我\ifdefined\ishandout ...
在演示文稿的开头使用,并为讲义准备一个单独的文件,其中只包含
\def\ishandout{1}
\input{topic.tex}
由于讲义文件始终按照架构命名,因此topic_handout.tex
我正在寻找一种方法来剥离内部文件_handout
,以便我可以对所有演示文稿使用相同的讲义文件而不更改内容。我发现\jobname
这给了我topic_handout
,所以我只需要剥离常量字符串_handout
并添加.tex
到参数中\input
。由于这发生在声明文档类之前,因此我无法使用任何包。欢迎任何帮助。
答案1
不太清楚问题是什么;据我了解,你想要的是
pdflatex topic_handout
实际上是topic.tex
在定义之后输入的\ishandout
。这可以在命令行上完成,不需要辅助文件topic_handout.tex
:
pdflatex "\def\ishandout{1}\input{topic}"
如果你不想使用命令行,你的topic_handout.tex
文件可能是
\def\ishandout{1}
\edef\x{\def\noexpand\dehandout##1\detokenize{_handout}{##1}}\x
\expandafter\input\expandafter{\expandafter\dehandout\jobname}
答案2
您可以在参数文本中定义一个宏_handout
,这样就可以删除此部分。这需要更高级的编码。下面我尝试解释一下:
您需要使用 plainTeX 宏\def
而不是 LaTeX 宏\newcommand
来实现这一点。一个问题是,除空格之外的所有字符都\jobname
以 catcode 12 返回其他并且不是字母(catcode 11)正常。要使用正确的 catcode 定义宏,您可以使用 LaTeX 的\@onelevel@sanitize
宏将整个宏定义转换为 catcode其他\expandafter
然后在定义删除宏之前,你需要大量的s 来扩展辅助宏。
% somename_handout.tex
\def\handoutstr{_handout}
\makeatletter
\@onelevel@sanitize\handoutstr% to get right catcodes!
\makeatother
\expandafter\def\expandafter\removehandout\expandafter#\expandafter1\handoutstr\relax{#1}
%\def\ishandout{1}
% better:
\PassOptionsToClass{handout}{beamer}
\input{\expandafter\removehandout\jobname\relax}
此外,最好使用\PassOptionsToClass{handout}{beamer}
而不是\def\ishandout{1}
。这会将handout
选项直接传递给beamer
类。然后在演示文件中,您可以使用\mode<handout>{ handout-only code }
:
% somename.tex
\documentclass{beamer}
\mode<handout>{%
% handout-only code
}
\begin{document}
\begin{frame}
% ...
\end{frame}
% ...
%
\end{document}