dtx プリアンブル内の危険な \if@

dtx プリアンブル内の危険な \if@

.dtx同等のファイルはコンパイルできるのに、次のファイルはコンパイルできないのはなぜですか.tex? (ファイルには という名前を付ける必要があります。error.dtxこれが\DocInputインクルードされるものです。)

DTX:

% \iffalse meta-comment
%<*driver>
\documentclass{ltxdoc}
\input pgfutil-common
\makeatletter
\def\myitem#1{%
  \pgfutil@in@{,}{#1}%
  \ifpgfutil@in@
    \myitem@#1\@end
  \else
    \myitem@#1,\@end
  \fi
}
\def\myitem@#1,#2\@end{\item\texttt{#1}\quad\marginpar{\small\it#2}}
\makeatother
\begin{document}
  \DocInput{error.dtx}
\end{document}
%</driver>
% \fi
% \begin{description}
%   \myitem{align,key} This is documentation for key \emph{align}.
% \end{description}
% \endinput

ラテックス:

\documentclass{ltxdoc}
\input pgfutil-common
\makeatletter
\def\myitem#1{%
  \pgfutil@in@{,}{#1}%
  \ifpgfutil@in@
    \myitem@#1\@end
  \else
    \myitem@#1,\@end
  \fi
}
\def\myitem@#1,#2\@end{\item\texttt{#1}\quad\marginpar{\small\it#2}}
\makeatother
\begin{document}
  \begin{description}
    \myitem{align,key} This is documentation for key \emph{align}.
  \end{description}
\end{document}

答え1

この原因の診断は\else正しいです。これを解決する別の方法は、新しいコードをDocstripの「ドキュメント」部分に配置することです。これを行うには、定義内のコメント文字を次のように変換する必要があります。^^A

% \iffalse meta-comment
%<*driver>
\documentclass{ltxdoc}
\input pgfutil-common %
\begin{document}
  \DocInput{\jobname.dtx}
\end{document}
%</driver>
% \fi
%\makeatletter
%\def\myitem#1{^^A
%  \pgfutil@in@{,}{#1}^^A
%  \ifpgfutil@in@
%    \myitem@#1\@end
%  \else
%    \myitem@#1,\@end
%  \fi
%}
%\def\myitem@#1,#2\@end{\item\texttt{#1}\quad\marginpar{\small\it#2}}
%\makeatother
% \show\myitem
% \begin{description}
%   \myitem{align,key} This is documentation for key \emph{align}.
% \end{description}
% \endinput

答え2

文書が 2 回目に処理されるとき ( によって入力される\DocInput)、TeX は\iffalseファイルの先頭で を見つけます。これは、コメント記号の後に\iffalse続くと一致し、プリアンブルをスキップすることを意図しています。しかし、そうはなりません。の定義で で\fi止まってしまいます。\else\myitem

通常、\ifpgfutil@in@ネストされた条件文で使用しても安全ですが、なぜこのようなことが起こるのでしょうか?

答えは、\ifpgfutil@in@の catcode が@文字ではなくその他であるため、TeX は 2 回目のパスで no を見つけないということです --- は'sで停止した\makeatletterによってスキップされました...\iffalse\ifpgfutil@in@\else

手っ取り早い解決策としては、\if2 回目のパスで TeX にのみ表示されるコメントを提供することです。

% \iffalse meta-comment
%<*driver>
\documentclass{ltxdoc}
\input pgfutil-common
\makeatletter
\def\myitem#1{%
  \pgfutil@in@{,}{#1}%
  \ifpgfutil@in@          %\if
    \myitem@#1\@end
  \else
    \myitem@#1,\@end
  \fi
}
\def\myitem@#1,#2\@end{\item\texttt{#1}\quad\marginpar{\small\it#2}}
\makeatother
\begin{document}
  \DocInput{error.dtx}
\end{document}
%</driver>
% \fi
% \begin{description}
%   \myitem{align,key} This is documentation for key \emph{align}.
% \end{description}
% \endinput

あるいは、おそらくもっと良いのは、問題を引き起こす可能性のあるすべてのコードを別のファイルに入れることです...

関連情報