建议如何将“breqn.sty”与“xmltex.tex”一起使用

建议如何将“breqn.sty”与“xmltex.tex”一起使用

当我们\usepackage{breqn}包括

\XMLelement{TEI.2}{}
  { \documentclass{article}
    \usepackage{ifthen,url}
    \usepackage{breqn}
    \begin{document}  }
  {\end{document}}  

我们收到以下错误:

! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! 啊,内部 LaTeX3 错误!

模块内核,消息名称“command-already-defined”:参数'

请指教如何修改下面的宏以"xmltex.tex" 避免上述错误:

% set up 7bit range
\count@0
\catcode0=13
\gdef\XML@tempa{
 \begingroup
   \uccode0\count@
  \uppercase{\endgroup
    \edef^^@{
      \ifnum\catcode\count@=11 %
        \noexpand\utfeightay\else\noexpand\utfeightax\fi
      \noexpand^^@}
    \expandafter\edef\csname 8:\string^^@\endcsname{\string^^@}}
 \ifnum\count@<127\advance\count@1 \expandafter\XML@tempa\fi}
\XML@tempa
\catcode0=9

答案1

真的,这些天我不会推荐它xmltex,我写了它,但我想这可能是我十年左右第一次运行它......

加载breqnexpl3之后xmltex改变了一些事情大概可以工作但实际上我不会尝试(或者至少我刚才尝试过而且工作量比合理的要大)

您可以在开始breqn之前xmltex通过编辑提前加载manual.tex(例如,看起来像

\def\xmlfile{manual.xml}
\RequirePackage{breqn}
\input xmltex

然后使用pdflatex而不是pdfxmltex那样加载所有包而不会出现错误,但随后文档进入无限循环处理 URL

! Interruption.
\Url@String ->h
               ttp://www.latex-project.org/lppl.txt
l.68 </front>

? 
! Interruption.
\Url@String ->h
               ttp://www.latex-project.org/lppl.txt
l.68 </front>

总的来说,我认为不要使用breqnwith xmltex。如果您想使用breqn(或者即使您不想使用),现在使用 XSLT 或其他 XML 感知处理语言将您的 XML 写成普通的 tex 语法要容易得多,然后您可以使用所需的任何 latex 构造。

答案2

expl3可以通过改变(ASCII null)的性质来解决加载问题^^@,例如

\begingroup
  \catcode`\^^@=\active
  \gdef\savenull{%
    \let\savednull^^@\let^^@\undefined
  }%
  \gdef\restorenull{\let^^@\savednull}
\endgroup

\XMLelement{TEI.2}{}
  { \documentclass{article}
    \usepackage{ifthen,url}
    \savenull
    \usepackage{expl3}
    \restorenull
    \begin{document}  }
  {\end{document}}  

可能这可以/应该自行排序expl3(我们需要在应用我们自己的定义之前注意活动空值)。

我可以去breqn_loadby then dealing with the nature of吗?`

\XMLelement{TEI.2}{}
  { \documentclass{article}
    \usepackage{ifthen,url}
    \setupnull
    \catcode`\?=12 %
    \usepackage{breqn}
    \restorenull
    \catcode`\?=\active
    \begin{document}  }
  {\end{document}}

?出现在一个控制序列名称里面breqn。)

然而,这在实际文档中不起作用。原因是它breqn通过为一系列数学模式符号提供“活动”定义来工作。你例如,通过保存/恢复来强制过去

\begingroup
  \catcode`\^^@=\active
  \gdef\setupnull{%
    \let\savednull^^@\let^^@\undefined
  }%
  \gdef\restorenull{\let^^@\savednull}
\endgroup
\gdef\looper#1{\ifx\relax#1\relax\else\foo#1\expandafter\looper\fi}
\gdef\fooa#1{%
  \lccode`\~=`#1 %
  \lowercase{\expandafter\let\csname saved\string#1\endcsname~}%
}
\gdef\foob#1{%
  \lccode`\~=`#1 %
  \lowercase{\expandafter\let\expandafter~\csname saved\string#1\endcsname}%
}
\gdef\chars{r<>:-!/=?}
\XMLelement{TEI.2}{}
  { \documentclass{article}
    \usepackage{ifthen,url}
    \setupnull
    \let\foo\fooa
    \expandafter\looper\chars\relax
    \catcode`\?=12 % 
    \usepackage{breqn}
    \restorenull
    \let\foo\foob
    \expandafter\looper\chars\relax
    \catcode`\?=\active
    \begin{document}  }
  {\end{document}}

但是,这或多或少会禁用所有breqn工作方式。我会选择大卫的结论:最好使用替代方法从 XML 生成 LaTeX,然后自由选择包。

相关内容