使用 pstool 编译失败:\begin{document} 包含在 \makeatletter \makeatother 中

使用 pstool 编译失败:\begin{document} 包含在 \makeatletter \makeatother 中

beamer我正在尝试使用创建 LaTeX 演示文稿pstool,自从将我的系统更新到 Ubuntu 13.10(pstool 1.5a,TeX Live 2013)后,pstool 辅助 TeX 文件(*-pstool.tex)的编译失败,日志中显示以下消息:

! Improper \spacefactor.
\@->\spacefactor 
                 \@m 
l.19 \immediate \write \@
                         mainaux {\@percentchar <*PSTOOLLABELS>}

我可以将问题追溯到创建的文件中的以下部分:

\makeatletter 
\def \thepage {\csname @arabic\endcsname \c@page }
\setcounter {page}{15}
\@input {presentation.oldaux}

\begin {document}
\immediate \write \@mainaux {\@percentchar <*PSTOOLLABELS>}
\makeatother 
\centering \null \vfill 

如果我将 移到\begin{document}下方或在其后\makeatother添加另一个,我可以手动编译辅助文件(latex、dvipdf),但这当然不是解决方案。显然,取消了。问题是有问题的部分是由 pstool 自动生成的,并且手动更改每个 EPS 图形几乎不可行。有什么想法可以解决这个问题吗?\makeatletter\begin{document}\makeatletter

编辑:以下是使用 的 TeX 文件的完整示例pstool。在本例中,错误发生在编译由 创建的辅助文件期间pstool。EPStest-pstool.tex文件test.eps仅包含一个带有标签“test”的框。

\documentclass[a4paper]{beamer}

\usepackage[crop=pdfcrop]{pstool}
\usepackage[utf8]{inputenc}
\usepackage[T1]{fontenc}
\EndPreamble

\begin{document}

\begin{frame}{Test}
  \begin{figure}[p]
    \begin{center}
      \pstool[width=0.5\textwidth]{test}{
        \psfrag{test}[][]{Test}
      }
      \caption{Test}
    \end{center}
  \end{figure}
\end{frame}

\end{document}

答案1

确实,重置了执行\begin{document}的类别代码,但仅限于,而不是在标准类中。这可能是问题至今未被发现的原因。@\makeatotherbeamer

这只是\makeatletter在包中增加用于编写辅助文件的宏的问题(我\makeatother之前也会添加,只是为了对称)。如果作者意识到了这个问题,我非常肯定将会做出改变。

作为一个临时的解决方法,您可以通过将相关宏复制到您的序言中并添加缺失的部分来修补它:

\makeatletter
\def\pstool@write@processfile#1#2#3{%
  \immediate\openout\pstool@out #2\[email protected]\relax
  [...]
% And the document body to place the graphic on a page of its own:
    \noexpand\@input{\jobname.oldaux}^^J^^J%
    \noexpand\makeatother^^J^^J% <---- ADDED
    \noexpand\begin{document}^^J%
    \noexpand\makeatletter^^J%   <---- ADDED
    \unexpanded{\immediate\write\@mainaux}{\pstool@auxmarker*}^^J%
    \noexpand\makeatother^^J%
  [...]
  \immediate\closeout\pstool@out
}
\makeatother

其中[...]表示不应修改的(长)部分。

etoolbox一种更简单的策略是修补宏。不幸的是,无法用修补宏,因为它包含^^J。但你可以用regexpatch

\documentclass[a4paper]{beamer}

\usepackage[crop=pdfcrop]{pstool}
\usepackage[utf8]{inputenc}
\usepackage[T1]{fontenc}
\EndPreamble

\usepackage{regexpatch}
\makeatletter
\xpatchcmd\pstool@write@processfile
 {\noexpand\begin{document}}
 {\noexpand\makeatother^^J^^J%
  \noexpand\begin{document}^^J%
  \noexpand\makeatletter}
 {}{}
\makeatother

\begin{document}

\begin{frame}{Test}
\pstool[width=0.5\textwidth]{test}{
  \psfrag{test}[][]{Test}
}
\end{frame}

\end{document}

我不是这方面的专家pstool,所以我把\EndPreamble它放在看起来更合适的地方。

相关内容