![从一个 tex 文件自动创建两个 PDF 输出文件](https://linux22.com/image/256049/%E4%BB%8E%E4%B8%80%E4%B8%AA%20tex%20%E6%96%87%E4%BB%B6%E8%87%AA%E5%8A%A8%E5%88%9B%E5%BB%BA%E4%B8%A4%E4%B8%AA%20PDF%20%E8%BE%93%E5%87%BA%E6%96%87%E4%BB%B6.png)
假设我有一个 tex 文件foo.tex
。现在,我想实现 pdflatex 不仅创建一个文件foo.pdf
,而且还同时创建一个与 相同的文件fooxy.pdf
(!) foo.pdf
。这个问题有简单的解决方案吗?
附言:
- 是的,我可以通过复制文件管理器中的文件并重命名来实现这一点。但我希望有一个自动解决方案。
- 不,我没有疯。请不要问我为什么我想做这个。
答案1
我想到三种方法来解决这个问题:
&&
您可以在后面添加复制命令,pdflatex
如下所示:
pdflatex foo.tex && cp foo.pdf fooxy.pdf
它只需一行就可以完成您想要的所有事情,这是一个简单的解决方案。
制作
您可以通过创建如下 Makefile 使其稍微复杂一些:
namebase = foo
nameaddon = xy
tex = pdflatex # Might wanna set this to latexmk
.PHONY : all
all : $(namebase)$(nameaddon).pdf
$(namebase)$(nameaddon).pdf : $(namebase).pdf
cp $< $@
$(namebase).pdf : $(namebase).tex
$(tex) $<
这在命名文件时为您提供了更大的灵活性,并且除非需要,否则它不会编译或复制。您只需发出
make all
并make
决定需要做什么。
球座
这确实不是这种方法行不通,但这是我首先想到的方法。该命令tee
从标准输入读取数据,并写入标准输出和作为参数给出的文件。如果pdflatex
要将 pdf 写入标准输出,您可以使用
pdflatex foo.tex | tee foo.pdf fooxy.pdf > /dev/null
但作为pdflatex
才不是这种方法失败了。
答案2
仅适用于 Microsoft Windows 用户。
它已经在我的日常工作中得到了适当的测试。
rem this file name is pdflatexdup.bat
rem first arg specifies the master input filename without extension
rem remaining args specifies a list of duplicate filenames
rem remove the previously created master PDF
if exist "%~1.pdf" del "%~1.pdf"
rem create master PDF
if exist "%~1.tex" pdflatex -draftmode -interaction=batchmode "%~1.tex"
if exist "%~1.tex" pdflatex -draftmode -interaction=batchmode "%~1.tex"
if exist "%~1.tex" pdflatex -draftmode -interaction=batchmode "%~1.tex"
if exist "%~1.tex" pdflatex "%~1.tex"
rem remove unnecessary files
for %%x in (aux log out toc nav snm) do (if exist "%~1.%%x" del "%~1.%%x")
rem save the master file name
set master=%~1
shift
:loop
if "%~1"=="" goto :eof
copy "%master%.pdf" "%~1.pdf"
shift
goto :loop
rem remove the master PDF if you want
rem if exist "%master%.pdf" del "%master%.pdf"
如何使用:
foo.tex
使用在 CMD 窗口中输入以下命令来编译您的。
pdflatexdup foo a b c d e f g
其中a
、b
、c
、 ...g
是重复的文件名。编译后,您将获得 8 个 99.99% 相同的 PDF 文件(包括主 PDF)。
如果重复的名称包含空格,则需要用引号将其括起来,如下所示:
pdflatexdup foo a b c d e f g "garbage collector"
在这种情况下,您将获得如下的 9 个 PDF 文件。
答案3
pdflatex -shell-escape
当您以(MikTeX)形式运行 LaTeX 时,您可以在 LaTeX 内部运行 LaTeX :
\documentclass{article}
\write18{pdflatex --jobname="\jobname xy" \jobname}
\begin{document}
Hello Copy!
\end{document}
这样做的好处是第二次运行可以略有不同,例如另一种页面布局。
答案4
在 Linux 系统中的 LaTeX 中可以是:
% Need --enable-write18 or --shell-escape
\immediate\write18{cp foo.pdf fooxy.pdf}
cp
或者,您可以调用任何其他命令(例如,多次运行 pdflatex 的脚本)来代替(复制)。
附录:在 Windows 系统中可以(未经测试):
\immediate\write18{foo.bat}
哪里foo.bat
有一个带有 .bat 扩展名的简单文本文件,其中包含以下文本:
pdflatex foo.tex
copy foo.pdf fooxy.pdf
del foo.aux
del foo.log
但这没有意义,因为最简单的方法就是单独执行批处理文件:
C:\SOMEDIR> foo