包含以当前文件名的子字符串命名的 LaTeX 文件

包含以当前文件名的子字符串命名的 LaTeX 文件

我经常用 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}

相关内容