![同时将许多内容源文件编译成一个样式文件](https://linux22.com/image/272387/%E5%90%8C%E6%97%B6%E5%B0%86%E8%AE%B8%E5%A4%9A%E5%86%85%E5%AE%B9%E6%BA%90%E6%96%87%E4%BB%B6%E7%BC%96%E8%AF%91%E6%88%90%E4%B8%80%E4%B8%AA%E6%A0%B7%E5%BC%8F%E6%96%87%E4%BB%B6.png)
我正在写五篇左右的课文,作为课程笔记。我有一个主文件,Style.tex
里面包含了这些课程笔记的各个正文。我这样做的原因是,这样更容易确保我在多个文档中使用相同的样式和符号。但是,我必须进行编辑Style.tex
以指定要包含哪些正文。如果我可以同时编译所有笔记并使用一个命令为每组笔记生成 pdf,那就太好了。
有人对如何做到这一点有什么建议吗?
答案1
我认为你现在的做法与必须做的事情相反。如果你不想麻烦地编写自己的类(如 David Carlisle 所建议的)甚至包(这有点棘手),那么你可以使用标准溶液如下 :
首先,您将所有必须共享的手动设置(且仅限此)放入一个mystyle.sty
文件(不带\documentclass[]{}
或不带)。\begin{document}.....\end{document}
\usepackage{}
其次,将课程文件重新组织为常规 tex 文件(每个课程一个),如下所示:
\documentclass[<options>]{report} % or another class you prefer
\input{mystyle.sty}
% here put settings or info specfc to to this course, as \title{} aso>
\begin{document}
<body text>
\end{document}
然后,您可以在共享 的所有内容时编译它们mystyle.sty
,而无需多次编辑。此外,如果您在此更改了某些内容mystyle.sty
,您将能够通过简单地重新编译所有课程文件来转移更改,而无需编辑它们(如果您有许多课程,脚本对于这最后一步可能很有用...)
编辑对于 DOS/Windows 来说一个非常简单的批处理文件是:
@echo off
FOR %%C IN ("*.tex") do (
echo "compiling" %%~C
pdflatex -interaction=nonstopmode -shell-escape %%~dpnC > all.log
FOR %%A IN ("aux","out","nav","log","toc","thm") do IF EXIST %%~dpnC.%%A (del %%~dpnC.%%A)
)
pause
当然 :
"*.tex"
可以改进为"course*.tex"
- 该
pdflatex
行可以根据您的目的进行定制,或者最好用另一个构建所有内容(包括 BiBTeX 书目、索引等)的脚本替换。 - 删除列表可以以直接的方式进行扩展。
答案2
我刚刚自己为此编写了一个批处理脚本(适用于 Windows)。
@ECHO off
FOR /L %%X IN (1,1,5) DO (
IF EXIST %%X.tex (
TYPE start.tex > temp.tex
TYPE %%X.tex >> temp.tex
TYPE stop.tex >>temp.tex
pdflatex -synctex=0 -interaction=nonstopmode -shell-escape -jobname=%%X temp
)
)
FOR /L %%X IN (1,1,5) DO ( DEL %%X.aux & DEL %%X.log & DEL %%X.out)
PAUSE
1.tex
将、2.tex
、 ... 、5.tex
(文件的名称)放置在包含此脚本(名为whatever.bat
)的目录中。创建一个start.tex
文件(在同一目录中),如下所示
\documentclass{someclass}
some preamble
\begin{document}
以及一个 stop.tex 文件(位于同一目录中),其中包含
\end{document}
脚本的作用是检查文件是否1.tex
存在,如果存在,则写入start.tex
,在中temp.tex
包含文本,写入并使用名称进行编译。然后转到,依此类推。1.tex
temp.tex
stop.tex
temp.tex
temp.tex
1.pdf
2.tex
该命令前的行PAUSE
删除辅助文件。您可能想要删除此行。
您可能还想更改pdflatex
选项。
如果您获得更多文档,请将(或两者)for
循环更改为(start,step,stop)
,即(1,1,10)
针对 10 个文档。
请注意,这是我的第一个批处理脚本,我强烈建议您在使用之前先备份一下您编写的内容。如果您使用的是 Linux,也许有人可以编写一个bash
脚本(我现在无法访问 Linux)。
编辑:请使用 jhor 的。正如指出的那样,我的是初学者的。对我来说,编号很重要(教科书中的解决方案文件,以 pdf 形式附加到特定问题,然后可以随意抛出),因此简单的 for 循环就可以完成工作。
答案3
另一个选择是在命令行上定义要编译的内容文件。
因此,如果将下面的文件保存为Style.tex
,则要编译的主体,DocumentA
您将使用:
pdflatex "\def\MyFile{DocumentA}\input{Style.tex}"
这样就消除了更改Style.tex
文件的任何需要。
笔记:
- 虽然这是一个单独的主题,但我认为值得一提:如果你也希望能够
DocumentA
直接编译,那么你也应该看看包裹standalone
。例如,嵌套独立文件和独立包
代码:
\documentclass{article}
%% Your custom style settings, either included from a .sty
%% or defined here.
\begin{document}
\ifdefined\MyFile
\input{\MyFile}
\else
\PackageError{Style.tex}{"MyFile" was not defined.}{}
\fi
\end{document}