
.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
手っ取り早い解決策としては、\if
2 回目のパスで 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
あるいは、おそらくもっと良いのは、問題を引き起こす可能性のあるすべてのコードを別のファイルに入れることです...