使用导入包在 auctex 中编译一个区域

使用导入包在 auctex 中编译一个区域

考虑以下三个(见下文)文件: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注意:如果有帮助的话,我可以在部分中添加导入和子导入文件的目录。

emacs 截图

├── _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。因此,计划如下:

  1. 暂时重新定义\message
  2. 提取路径。(这实际上是最难的部分...我找不到任何可以做到这一点的包,所以我使用了pgfkeys。)
  3. 设置当前路径宏import所设置的任何内容。
  4. 确保所有这些仅在我们编译区域时才会发生。我们不想以重新定义的 结束\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文件中。

相关内容