我参与了一个处理大型文档的大型项目(每个文档有超过 100 个章节和约 1000 页)。目前,我们通过\input
.
该项目将极大地受益于切换到\include
,因为\includeonly
与部分 .aux 文件结合可以加快编译速度并保留交叉引用。
然而,一个讨厌的逗号挡住了路到目前为止,我们所有的文件路径都在文件夹名称中包含逗号(例如volume8,4/section1.tex
:)。\include
这样是可以的,但\includeonly
当然有很大的解析问题,因为需要用逗号分隔要包含的文件的名称。
我知道文件名中使用逗号是个坏主意,句号。一劳永逸地更改文件夹名称显然要好得多。
然而,鉴于这是一个长期运行、涉及多卷的项目,有多名合作者参与,因此这种变化不太可能发生。此外,我们的文件结构中逗号的出现虽然可以预见,但却非常普遍——它们出现在主文档以及各个章节中,这些章节包括\input
树中的图形或其他文件。
本着尝试解决逗号问题的精神,我的问题如下:
1. 有没有办法教\includeonly
如何正确解析路径?那是,
\includeonly{volume8,4/section1}
应该包括volume8,4/section1.tex
而不是(不存在的)文件volume8.tex
和4/section1.tex
。
我已经研究并尝试了不同的方法来转义或引用逗号(","
,,\string
附加括号),并且还尝试按照建议更改逗号的 catcode这里;都无济于事。其中一些方法对空格在路径中,但逗号似乎没有希望。
编辑:双括号,如\includeonly{{volume8,4/section1}}
,也不起作用。
1.a. 解决方案如何处理多文件包含?例如:
\includeonly{volume8,4/section1, volume8,4/section2}
应包括section1.tex
和section2.tex
。
2. 指定路径有帮助吗\include(only)
?路径应该处理(适当处理/转义/引用的)逗号,它不需要在参数中明确显示。然后我会写:
\includeonly{section1,section2}
是否存在一些内部宏来指定所有包含的路径,其方式\input@path
-\input
以及它在这里有任何帮助吗?
以下是 MWE:
\documentclass{article}
%\usepackage{shellesc} % Some code to generate the appropriate folders and files
%\ShellEscape{mkdir volume8,4}
%
%\begin{filecontents}[overwrite]{volume8,4/section1.tex}
%\section{First section}
%Hello
%\end{filecontents}
%\begin{filecontents}[overwrite]{volume8,4/section2.tex}
%\section{Second section}
%Bye
%\end{filecontents} % End of code for folders and files
%\includeonly{volume8,4/section1} % How to make this work?
\begin{document}
\include{volume8,4/section1}
\include{volume8,4/section2}
\end{document}
答案1
目前最简单的解决方案是在 Linux/Mac 命令行中执行
ln -s volume8,4 volume8.4
那么该目录(从任何应用程序)都可以用任一名称引用,因此您可以避免使用 TeX 中的逗号,
但是如果这不可能的话我确实让它工作了
\documentclass{article}
\includeonly{section1}
\begin{document}
\include{section1}
\include{section2}
\end{document}
即删除目录名,然后要将该目录添加到搜索路径。这应该是
TEXINPUTS=volume8,4: pdflatex mainfile
但这不起作用,kpathse 似乎也有逗号问题。
然而这做工作
TEXINPUTS=".//:" pdflatex bb460
它将递归添加当前目录下的所有目录。当然,这假设文件名是唯一的,如果你有section1.tex
多个子目录,这将失败。
答案2
此外David Carlisle 的基于文件系统的答案,我不断尝试,发现更简单的解决方案。
它不需要命令行:一切都可以指定在文档中通过重新定义\input@path
。逗号被适当地“掩盖”(使用括号和\string
)并“隐藏”在路径内,因此它不会在 中明确显示\includeonly
,这体现了点2在我的问题中。这样,我们就绕过了解析问题。
在我的问题中,我忽略了\include
它的核心包含一个\input
命令。内部宏也\input@path
对有影响\include(only)
。路径\include
通过发出以下命令来指定
\def\input@path{{volume8\string,4/}}
这使得逗号无害。包含命令
\include{section1}
\includeonly{section1,section2}
然后按预期工作。主文档生成部分 .aux 文件,并通过选择性包含\includeonly
保留交叉引用。
不足之处:通常会生成部分 .aux 文件在(子)目录中包含“部分”,即包含的 .tex 文档(此处为子文件夹volume8,4
)。使用我的解决方案,它们生成在主文件夹中主文件和主 .aux 所在的位置,因为程序无法写入“命名不正确”的目录。
尽管存在这种差异,所有部分文件都由\input
主 .aux 文件(即\@input{section1.aux}
)正确读取和编辑。交叉引用等均按相应方式处理。
我注意到的唯一缺点是主文件夹变得非常拥挤(就我们而言,这是值得付出的代价。)
如果您发现该解决方案的其他缺陷,请指出!
MWE 供参考:
\documentclass{article}
\makeatletter
\def\input@path{{volume8\string,4/}}
\makeatother
\includeonly{section1
%,section2 % multiple inclusion still relies on comma as separator
}
\begin{document}
\include{section1}
\include{section2}
\end{document}