我是一个非常懒惰的人,所以如果我的问题看起来有点奇怪,我提前抱歉。
在撰写论文时,我将整个文档的内容拆分为多个 .tex 文件,每个章节一个文件 - 对于这种情况,这是一种非常标准的方法。主 .tex 文件只是将所有内容聚集在一起:
...
\chapter{Introduction}
\label{chap:introduction}
\include{ch01_01}
\include{ch01_02}
...
\chapter{...}
...
相应地,该文件夹包含所有必需的文件:
ch01_01.tex
ch01_02.tex
...
chXX_XX.tex
...
thesis.tex
一切都很好,除了一件事:仅凭记住标题就很难导航到特定部分。部分顺序(甚至章节顺序)会随着时间的推移而改变,而且目录不是数字的良好来源,因为某些部分可能会在主文件中注释以提高渲染速度。因此,您需要做的是在选择正确的文件之前预览文件夹中的几个 .tex 文件。
显然将文件重命名为类似这样的名称会有所帮助:
ch01_01-motivation.tex
ch01_02-aims-and-objectives.tex
...
chXX_XX-importance-of-stackexchange-for-phd-students.tex
...
但这种改进也带来了麻烦:每次处理文件名时,您都必须更新每个实例\include
。此外,出于某种奇怪的原因,LaTeX 会默默地传递不存在的文件并继续渲染文档的其余部分,因此很容易失去对所做工作的控制并开始浪费时间。
这里可能的解决方案是使用类似 的函数\smartinclude{ch01_01}
,它会扫描文件夹以查找匹配的文件ch01_01???.tex
,如果不存在歧义,则包含一个。理想情况下,在任何其他情况下,获取致命错误也很有用。我知道存在类似的东西——您可以省略图像的扩展名,\includegraphics
但仍然可以得到您想要的。不幸的是,我对乳胶的了解太少,无法为我的“问题”提出任何类似的东西,所以如果有人提出解决方案,我将不胜感激。
我寻求的功能如何实现?
答案1
我认为这不是一个好主意:文件名不应该有硬连线编号。
我建议采用“标签系统”:
\makeatletter
\newcommand{\definefile}[2]{% #1 is a label, #2 is the file name
\global\@namedef{fn@#1}{#2}%
}
\newcommand{\loadfile}[1]{% #1 is a label
\input{\@nameuse{#1}}%
}
\makeatother
\definefile{01_01}{ch01_01-motivation}
\definefile{01_02}{ch01_02-aims-and-objectives}
\definefile{XX_XX}{chXX_XX-importance-of-stackexchange-for-phd-students}
然后,加载最后一个文件的命令将是
\loadfile{XX_XX}
您的命令的概念证明\smartinput
;这需要检查文件的存在性和唯一性。pdflatex --shell-escape
在 Unix 系统上运行:
\documentclass{article}
\usepackage{catchfile}
\newcommand{\smartinput}[1]{%
\CatchFileEdef\temp{|"ls |grep '^#1'"}{}%
\input{\temp}
}
\begin{document}
\smartinput{ch01_01}
\end{document}