考虑以下三个(见下文)文件:test.tex
位于主目录中,test1.tex
位于子目录中./test1/
,test11.tex
位于子子目录中./test1/test11/
(参见下面的目录结构)。
当我使用 auctex ( C-c C-c
) 从读取的缓冲区进行编译时test11.tex
,文件编译正确:没有问题。但是,如果我只想编译图形环境所在的区域(见下面的屏幕截图)C-c C-r
,它会失败。auctex_region_.tex
在主文件所在的目录中生成的 会在问题的末尾重现。发生这种情况是因为文件import
中没有发出 -相关命令_region_.tex
:因此graphicspath
没有调整。有解决方法吗?
Local Variables
注意:如果有帮助的话,我可以在部分中添加导入和子导入文件的目录。
├── _region_.aux
├── _region_.log
├── _region_.pdf
├── _region_.tex
├── test1
│ ├── test11
│ │ ├── KnuthAtOpenContentAlliance.jpg
│ │ ├── test11.log
│ │ └── test11.tex
│ └── test1.tex
├── test.aux
├── test.log
├── test.pdf
├── test-pics.pdf
└── test.tex
% This is ./test.tex
\documentclass{article}
\usepackage{graphics}
\usepackage{import}
\begin{document}
\import{./test1/}{test1.tex}
\end{document}
% This is ./test1/test1.tex
\subimport{test11/}{test11.tex}
% Local Variables:
% TeX-master: "../test.tex"
% End:
% This is ./test1/test11/test11.tex
% http://commons.wikimedia.org/wiki/File:KnuthAtOpenContentAlliance.jpg
\begin{figure}
\includegraphics{KnuthAtOpenContentAlliance}
\end{figure}
Test...
% Local Variables:
% TeX-master: "../../test.tex"
% End:
这是由 auctex 生成的文件_region_.tex
。
\message{ !name(../../test.tex)}% This is ./test.tex
\documentclass{article}
\usepackage{graphics}
\usepackage{import}
\begin{document}
\message{ !name(test1/test11/test11.tex) !offset(-4) }
\begin{figure}
\includegraphics{KnuthAtOpenContentAlliance}
\end{figure}
Test...
\message{ !name(../../test.tex) !offset(-7) }
\end{document}
答案1
检查_region_.tex
表明它包含该地区来自哪个文件的信息。
\message{ !name(test1/test11/test11.tex) !offset(-38) }
我们要做的就是提取路径并伪造它\includegraphics
。因此,计划如下:
- 暂时重新定义
\message
。 - 提取路径。(这实际上是最难的部分...我找不到任何可以做到这一点的包,所以我使用了
pgfkeys
。) - 设置当前路径宏
import
所设置的任何内容。 - 确保所有这些仅在我们编译区域时才会发生。我们不想以重新定义的 结束
\message
!
点 4 是通过将 AUCTeX 的变量设置TeX Command -> TeX Region Extra
为 来实现的\let\message\regioncompilationfix
。
下面是完成实际工作的代码。(只需要更改主文件。)
% This is ./test.tex
\documentclass{article}
\usepackage{graphics}
\usepackage{import}
\makeatletter
% 1. Temporarily redefine `\message`.
\let\regioncompilationfix@orig@message\message
\def\regioncompilationfix#1{%
\let\message\regioncompilationfix@orig@message
\message{#1}%
\regioncompilationfix@parsemessage#1%
}
\expandafter\def\expandafter\regioncompilationfix@parsemessage\space!name(#1) !offset(#2) {%
\getpath{#1}%
% 3. Set whatever the `import` package sets.
\edef\import@path{\getpathresult/}%
\edef\Ginput@path{{\getpathresult/}{./}}%
\edef\input@path{{\getpathresult/}{./}}%
}
% 2. Define a macro which extracts the path from path+filename.
\usepackage{pgfkeys}
\def\getpath#1{%
{%
%\pgfkeyslet{/getpath/#1}\relax
%\pgfkeyslet{/getpath/#1/.@cmd}\relax
% to be really sure this worked, we'd also need to delete
% key "/getpath/path/.unknown" ... but since we're searching for
% the "path", we just hope nothing's there ...
\pgfkeys{%
/handlers/.unknown/.code={%
\xdef\getpathresult{\pgfkeyscurrentpath}%(
\expandafter\getpath@stripprefix\getpathresult)%
},
/getpath/#1,
}%
}%
}
\def\getpath@stripprefix/getpath/#1){\gdef\getpathresult{#1}}
\makeatother
\begin{document}
\import{./test1/}{test1.tex}
\end{document}
更新:纯粹的 AUCTeX 方式
AUXTeX 提供了钩子TeX-region-hook
,它在区域缓冲区构建后立即运行。这是插入调整import
路径的 TeX 代码的 Elisp 代码:
(add-hook
'TeX-region-hook
(lambda ()
(goto-char (point-min))
(search-forward "\\begin{document}")
(insert
"\\makeatletter"
"\\def\\import@path{"
(TeX-quote-filename (file-name-directory original))
"}"
"\\edef\\Ginput@path{{\\import@path}{./}}"
"\\edef\\input@path{{\\import@path}{./}}"
"\\makeatother"
)
)
)
将此代码放入您的.emacs
文件中。