![pdflatex / xelatex -使用 \include 时的输出目录和子目录](https://linux22.com/image/252852/pdflatex%20%2F%20xelatex%20-%E4%BD%BF%E7%94%A8%20%5Cinclude%20%E6%97%B6%E7%9A%84%E8%BE%93%E5%87%BA%E7%9B%AE%E5%BD%95%E5%92%8C%E5%AD%90%E7%9B%AE%E5%BD%95.png)
当我使用 包含子目录中的文件\include{subdir/sub}
并使用 编译该文件时pdflatex -output-directory .tex_test/ main.tex
,pdflatex
会提示无法写入.tex_test/subdir/sub.aux
。 ( 也会出现同样的情况xelatex
)
有没有办法自动在 中创建必要的文件结构output-directory
?当然也可以,如果sub.aux
直接写入.tex_test/
,但我猜那是不可能的......
完整 MWE:
./main.tex
包含:
\documentclass{article}
\begin{document}
Main Document
\include{subdir/sub}
\end{document}
并且./subdir/sub.tex
包含任何内容。更重要的是目录.tex_test/
存在。
答案1
只需在不可见目录中重新创建与“可见”目录相同的树:我尝试过并且subdir
在里面创建一个目录.tex_test
就成功了。
其实我改了名字,但还是一样。以下是日志
This is pdfTeX, Version 3.1415926-2.4-1.40.13 (TeX Live 2012)
restricted \write18 enabled.
entering extended mode
(./canasub.tex
LaTeX2e <2011/06/27>
Babel <v3.8m> and hyphenation patterns for english, dumylang, nohyphenation, ge
rman-x-2012-05-30, ngerman-x-2012-05-30, afrikaans, ancientgreek, ibycus, arabi
c, armenian, basque, bulgarian, catalan, pinyin, coptic, croatian, czech, danis
h, dutch, ukenglish, usenglishmax, esperanto, estonian, ethiopic, farsi, finnis
h, french, friulan, galician, german, ngerman, swissgerman, monogreek, greek, h
ungarian, icelandic, assamese, bengali, gujarati, hindi, kannada, malayalam, ma
rathi, oriya, panjabi, tamil, telugu, indonesian, interlingua, irish, italian,
kurmanji, latin, latvian, lithuanian, mongolian, mongolianlmc, bokmal, nynorsk,
polish, portuguese, romanian, romansh, russian, sanskrit, serbian, serbianc, s
lovak, slovenian, spanish, swedish, turkish, turkmen, ukrainian, uppersorbian,
welsh, loaded.
(/usr/local/texlive/2012/texmf-dist/tex/latex/base/article.cls
Document Class: article 2007/10/19 v1.4h Standard LaTeX document class
(/usr/local/texlive/2012/texmf-dist/tex/latex/base/size10.clo))
(.canaout/canasub.aux (.canaout/canasub/sub.aux)) [1{/usr/local/texlive/2012/te
xmf-var/fonts/map/pdftex/updmap/pdftex.map}] (./canasub/sub.tex) [2]
(.canaout/canasub.aux (.canaout/canasub/sub.aux)) )</usr/local/texlive/2012/tex
mf-dist/fonts/type1/public/amsfonts/cm/cmr10.pfb>
Output written on .canaout/canasub.pdf (2 pages, 13249 bytes).
Transcript written on .canaout/canasub.log.
如您所见,sub.aux
文件是从.canasub/canasub
启用 shell 转义后,您可以创建目录:
\documentclass{article}
\makeatletter
\let\latex@include\include
\def\include#1{\include@aux#1\@nil}
\def\include@aux#1/#2\@nil{\@mkdir{#1}\latex@include{#1/#2}}
\ifnum\pdfshellescape=\@ne
\def\@mkdir#1{\immediate\write18{mkdir -p .tex_test/#1}}
\else
\def\@mkdir{\typeout{Expect errors}}
\fi
\begin{document}
Main Document
\include{canasub/sub}
\end{document}
这里我假设一个 Unix 系统(我不知道如何在 Windows 上创建目录)并且所有\include
命令都具有相同的结构
\include{subdir/file}
处理不同的模式应该相当容易。当然你必须添加-shell-escape
的调用pdflatex
。
然而该.tex_test
部分必须硬编码,因为 TeX 没有输出目录的内部知识。
答案2
WinEdt 7 能够自动完成您需要的操作。
只需TeXAux
在主文件夹中创建一个名为的子文件夹,WinEdt 就会自动创建子文件夹。
您甚至不需要传递-output-directory
到命令行。
答案3
我对 LaTeX 文档使用 Makefile。此命令在输出目录中创建根目录的目录结构:
mkdir -p ${OUTPUTDIRECTORY}
for DIR in $(shell find . -maxdepth 1 -mindepth 1 -type d -exec basename '{}' \;) ; do mkdir -p ${OUTPUTDIRECTORY}/$$DIR ; done
-maxdepth
find
定义查找目录的深度。我从这里。
使用 Rakefile 或 Python 脚本可能会使这更容易。似乎没有办法pdflatex
自动创建必要的目录。