
Por que o seguinte .dtx
não é compilado, enquanto o .tex
arquivo equivalente sim? (Você deve nomear o arquivo error.dtx
, é isso que \DocInput
inclui.)
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
Látex:
\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}
Responder1
O diagnóstico a que isso se deve \else
está correto. Uma abordagem alternativa para resolver isso é colocar o novo código na parte do 'documento' do Docstrip. Para fazer isso, os caracteres de comentário na definição precisarão ser convertidos para^^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
Responder2
Quando o documento é processado pela segunda vez (sendo inserido por \DocInput
), o TeX fica \iffalse
no topo do arquivo. A intenção é que \iffalse
corresponda ao \fi
sinal de comentário seguinte, pulando assim o preâmbulo. Mas isso não acontece. Fica preso \else
na definição de \myitem
.
Normalmente, \ifpgfutil@in@
é seguro usar em condicionais aninhadas, então por que isso acontece?
A resposta é que o TeX não encontra \ifpgfutil@in@
na segunda passagem, já que o catcode de @
é outro, não a letra --- \makeatletter
foi ignorado pelo mesmo \iffalse
que ficou preso em \ifpgfutil@in@
's \else
...
Uma solução rápida e suja é fornecer um comentário \if
que só ficará visível para o TeX na segunda passagem:
% \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
Ou, talvez ainda melhor, colocar todo o código potencialmente ofensivo em um arquivo separado...