在这个最小(不)工作的例子中,我尝试使用单字节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
它对我来说运行起来没有错误。