如何 \include 路径中带有逗号的文件

如何 \include 路径中带有逗号的文件

我参与了一个处理大型文档的大型项目(每个文档有超过 100 个章节和约 1000 页)。目前,我们通过\input.

该项目将极大地受益于切换到\include,因为\includeonly与部分 .aux 文件结合可以加快编译速度并保留交叉引用。

然而,一个讨厌的逗号挡住了路到目前为止,我们所有的文件路径都在文件夹名称中包含逗号(例如volume8,4/section1.tex:)。\include这样是可以的,但\includeonly当然有很大的解析问题,因为需要用逗号分隔要包含的文件的名称。

我知道文件名中使用逗号是个坏主意,句号。一劳永逸地更改文件夹名称显然要好得多。

然而,鉴于这是一个长期运行、涉及多卷的项目,有多名合作者参与,因此这种变化不太可能发生。此外,我们的文件结构中逗号的出现虽然可以预见,但却非常普遍——它们出现在主文档以及各个章节中,这些章节包括\input树中的图形或其他文件。

本着尝试解决逗号问题的精神,我的问题如下:

1. 有没有办法教\includeonly如何正确解析路径?那是,

\includeonly{volume8,4/section1}

应该包括volume8,4/section1.tex而不是(不存在的)文件volume8.tex4/section1.tex

我已经研究并尝试了不同的方法来转义或引用逗号(",",,\string附加括号),并且还尝试按照建议更改逗号的 catcode这里;都无济于事。其中一些方法对空格在路径中,但逗号似乎没有希望。

编辑:双括号,如\includeonly{{volume8,4/section1}},也不起作用。

1.a. 解决方案如何处理多文件包含?例如:

\includeonly{volume8,4/section1, volume8,4/section2}

应包括section1.texsection2.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}

相关内容