在单字节编码代码中扩展宏

在单字节编码代码中扩展宏

在这个最小(不)工作的例子中,我尝试使用单字节latin10编码的源文件,并扩展包含字符的命令宏\catcode254

    % -*- mode: latex; unibyte: t; coding: iso-8859-16 -*-
    \documentclass[a4paper,10pt]{report}

    \usepackage[T1]{fontenc}
    \usepackage[latin10]{inputenc}

    \newcommand\mwe{Lista de demonstrații}

    \begin{document}

      \chapter{Oscilații}

      \xdef\MWE{\mwe}

      \MWE

    \end{document}

但我\crcr在日志中收到这个“ ”错误:

    ! Illegal parameter number in definition of \MWE.
    <to be read again> 
                       \crcr 
    l.14 \xdef\MWE{\mwe
                       }

如果 (文件是不是UTF-8!)我用ț\catcode254)替换ș\catcode186),同样的错误。

相反,如果我用â\catcode226)或仅用替换t,错误就会消失。

这些latin10字母适用于东南欧语言。

我需要的类的有用代码\LaTeX与相关\addcontentsline;这里是另一个例子:

    % -*- mode: latex; unibyte: t; coding: iso-8859-16 -*-

    \documentclass[a4paper,10pt]{report}

    \usepackage[T1]{fontenc}
    \usepackage[latin10]{inputenc}

    \newcommand\mwe{Lista de demonstrații}
    \newcommand\toc[2]{\addcontentsline{toc}{section}{#1}}

    \begin{document}

      \makeatletter
      \@expandtwoargs\toc{\mwe}{}
      \makeatother

    \end{document}

和日志:

    ! Illegal parameter number in definition of \reserved@a.
    <to be read again> 
                       \crcr 
    l.14 \@expandtwoargs\toc{\mwe}{}

这是怎么回事?我很感激任何帮助。

谢谢。

Unicode(即\usepackage[utf8]{inputenc})在这里不是一个解决方案,因为这些latin10- 编码的行来自\TeX文本输入流(\immediate\read),因此存在单字节限制。

答案1

@David:\catcode254是字符 254 的 catcode,可能是 13。我不得不承认,我对你的说法有些惊讶,但原始海报也错误地使用了这个,可能是这个意思\char254

总是有可能使用 eTeX 功能来规避 LaTeX 的保护问题:

\edef\MWE{\unexpanded\expandafter{\mwe}}

然而,在使用 LaTeX 的写入命令的特定问题上,\protected@xdef似乎是可行的方法:写入通常涉及几种交错的扩展方式,预测它们意味着了解 LaTeX 内部的影响。\edef相比之下,上面的是从将在给定上下文中起作用的假设开始的\mwe,并产生了等效的结果。

还可以通过使用\protected\edef后跟上述内容来添加“终极”保护。在给定的应用程序中,它将不加改变地写出 8 位字符,而 LaTeX 的默认设置是写入 LICR(LaTeX 内部字符表示),类似于 \d{t} 之类的内容。因此即使在不同的输入编码下也适合读回。

答案2

如果我运行你的例子我得到

! Illegal parameter number in definition of \MWE.
<to be read again> 
                   \crcr 
l.12       \xdef\MWE{\mwe

使用 LaTeX\protect机制可以使活动字符变得健壮,但这只有在使用 LaTeX 机制时才有效。\xdef将破坏任何脆弱的命令。如果您将文档更改为

\makeatletter
      \protected@xdef\MWE{\mwe}
\makeatother

它对我来说运行起来没有错误。

相关内容