我想使用精确的我的 Beamer 演示文稿和讲义使用同一个文件。我不喜欢需要注释掉行才能创建讲义或演示文稿(我当前的解决方案),也不想使用命令来创建多个文件\input
。我意识到我可以有一个指向我主文件的链接(我在 Linux 或 BSD 中工作),比如
talk_handout.tex -> talk.tex
然后宏\jobname
会让我知道自己是在编译主文件还是链接。然后,使用\endswith
该xifthen
包,我可以确定是否应该使用讲义或演示模式。
理论上这都很好,但在实践中我不知道该怎么做。我通常使用[handout]
或 ,但我不知道如何将其与我想要的 用途结合起来。[beamer]
\documentclass
\jobname
当然,我可以在行\input
后紧接着一个命令来拥有两个文件\documentclass
...但我想知道是否还有其他方法。
有任何想法吗?
答案1
我的答案到这个问题正是这种情况。代码在那里,我不会重复,但我会尝试解释它的作用,以便您了解是否值得点击该问题。
我的解决方案正是您在第一段中概述的。我有一个包含所有代码的主文件,例如seminar.tex
,然后是一组符号链接,它们都指向此文件,并且格式为seminar.beamer.tex
,对于或(如果合适)也是seminar.handout.tex
如此。我加载的类实际上是一个包装器类,它查看各种参数(包括和从文档传递给它的任何参数),以决定使用哪个trans
article
\jobname
真实的类加载(以及使用哪些选项)。因此,我的真实文档的开头是这样的:
\documentclass[beamer,defaults]{myclass}
beamer
告诉它加载 beamer 类,defaults
设置一些我几乎总是使用的东西。然后它查看以\jobname
查看它是什么类型的文档:beamer
、handout
等,并将适当的选项传递给beamer
类。
对于讲座,我还有进一步的选择,即我的符号链接的格式实际上是:
main_file[.type[.lecture_name]].tex
当我编辑文档时,我确保通过我最感兴趣的符号链接(通常是版本beamer
)加载它,然后我的编辑器正确编译该版本。
我曾经使用过 Seamus 概述的方法。我改用这种方法是因为:
在进行系列讲座时,创建符号链接的批量加载比批量加载具有特定内容的文件要容易得多。
如果我做编译主文档,它会恢复到一些合理的状态。
实际上,它并不需要所有符号链接才能继续工作。由于您可以通过命令行重置作业名称,因此您只需执行此操作即可
pdflatex -jobname=seminar.beamer.tex seminar.tex
编译正确的版本。
答案2
这是我处理此类事情的工作流程。它与您的想法有很大不同,但或多或少实现了相同的目标。[编辑:它差别很大,以至于您的问题排除了这种答案。但其他寻找类似解决方案的人可能会发现这是可以接受的]
我有一个文件用于演示,一个文件用于讲义。每个文件都包含\input{content}
。然后我还有第三个content.tex
文件,其中包含演讲的实际内容。
%%% presentation
\documentclass{beamer}
\input{content}
上图:演示文稿;下图:讲义
%%% handout
\documentclass[handout]{beamer}
\input{content}
但是如果我不小心编译了 怎么办content.tex
?这会中断,因为它没有文档类声明。我使用我选择的编辑器的多文档功能:我指定 的主文档content.tex
是presentation.tex
。然后编译内容实际上会编译演示文稿。
在 emacs 中,这将是内容文件:
\begin{document}
\begin{frame}
...
\end{frame}
\end{document}
%%% Local Variables:
%%% mode: latex
%%% TeX-master: "presentation.tex"
%%% End:
我想我可以制作一个在两者上运行 pdflatex 的 makefile,但我不需要像我的演示文稿那样频繁地编译我的讲义:我经常使用叠加层并强制重新编译以检查特定幻灯片过渡是否符合我的要求......
答案3
使用的想法Martin Scharrer 对相关问题的回答下面的解决方案非常优雅。
假设有一个演示文稿talk.tex
:
$ ls talk.tex
talk.tex
$ head -1 talk.tex
\documentclass{beamer}
然后您可以handout
通过命令行提供类选项,如下所示:
$ pdflatex -jobname talk_print "\PassOptionsToClass{handout}{beamer}\input{talk}
$ pdflatex -jobname talk_print "\PassOptionsToClass{handout}{beamer}\input{talk}
这意味着talk_print.pdf
仅包含用于讲义或参考的整页。
$ pdflatex talk
$ pdflatex talk
这仅生成演示版本talk.pdf
,\pause
其中等命令按预期工作。
答案4
这是一篇非常老的帖子,但我也想分享我的解决方案(受到很多不同地方的启发)。您可以在 latex 文件的顶部添加以下内容:
\ifdefined\ishandout
\PassOptionsToClass{handout}{beamer}
\fi
\documentclass[... all your other options ...]{beamer}
然后,你可以使用以下命令生成讲义:
pdflatex -synctex=1 -interaction=nonstopmode "\def\ishandout{1} \input{yourtexfile.tex}"
或者像平常一样使用常规版本:
pdflatex -synctex=1 -interaction=nonstopmode yourtexfile.tex
我使用脚本稍微扩展了这一点(我的熟练程度bash
很低,可能不是最佳的),以生成讲义或常规版本而不覆盖生成的 pdf(基本上是讲义版本和\pause
启用的常规版本,以及我做的其他技巧):
##
## Generate latex PDF files and clear generated files
##
## Options:
## "-b" to also generate bibtex stuff
## "-h" to generate the handout version
texfile=$(ls *.tex | head -1)
filename=$(basename "$texfile" .tex)
gen_bibtex=""
gen_params="\input{$texfile}"
jobname="$filename"
while getopts 'bh' flag; do
case "${flag}" in
b) gen_bibtex="true" ;;
h) gen_params="\def\ishandout{1} \input{$texfile}"
jobname="$filename-handout"
;;
*) printf "Wrong flag passed.\n Usage:\n\t-b to generate the bibtex\n\t-h to generate a handout\n"
exit 1 ;;
esac
done
printf "\n*** generate $texfile with jobname $jobname ***\n\n"
pdflatex -synctex=1 -interaction=nonstopmode --jobname="$jobname" "$gen_params"
if [[ $gen_bibtex == "true" ]]; then
if [[ $gen_params == "\input{$texfile}" ]]; then
auxfile="$filename.aux"
else
auxfile="$filename-handout.aux"
fi
printf "\n\n*** generate bibtex $auxfile ***\n\n"
bibtex "$auxfile"
pdflatex --shell-escape -synctex=1 -interaction=nonstopmode --jobname="$jobname" "$gen_params"
fi
pdflatex --shell-escape -synctex=1 -interaction=nonstopmode --jobname="$jobname" "$gen_params"
printf "\n\n"
clear-latex-gen
printf "\n*** done ***\n"
脚本clear-latex-gen
(假设.tex
目录中只有一个文件):
##
## Clear latex gen files from current directory
##
texfile=$(ls *.tex | head -1)
filename=$(basename "$texfile" .tex)
printf "***remove generated files $filename ***\n"
declare -a extensions=(".log" ".dvi" ".nav" ".out" ".snm" ".vrb" ".toc" ".run.xml" ".fls" ".bbl" ".blg" ".aux" ".fdb_latexmk" "-blx.bib")
for ext in "${extensions[@]}"; do
rm ${filename}${ext} > /dev/null 2>&1
rm ${filename}-handout${ext} > /dev/null 2>&1
done