![makeidx、xstring、forloop 和 utf8 冲突](https://linux22.com/image/290840/makeidx%E3%80%81xstring%E3%80%81forloop%20%E5%92%8C%20utf8%20%E5%86%B2%E7%AA%81.png)
我在字符串中使用丹麦语字符,这些字符串是\StrCut
从包中拆分出来的,并在包中×string
使用。结果并不好。\forLoop
forloop
考虑这个小例子:
\documentclass{memoir}
\usepackage[utf8]{inputenc}
\usepackage[T1]{fontenc}
\usepackage{forloop}
\usepackage{xstring}
\usepackage{makeidx}
\makeindex
\StrCut{skøn|skat}{|}\pa\pb
\begin{document}
\pa
\pb
\newcounter{ct}
\forLoop{1}{1}{ct}{
\index{\pa}
}
\printindex
\end{document}
该\StrCut
命令将字符串拆分skøn|skat
为两个字符串,分别存储在\pa
和中\pb
。
当我运行时latexmk -pdf file.tex
出现此错误:
! Undefined control sequence.
l.3 \item sk\T
1\o n, 1
索引中印刷的单词是“sk1øn”,而不是“skøn”。
如果我省略\StrCut
并直接使用字符串skøn
,问题就消失。
如果我省略\forLoop
并直接使用\index{\pa}
,问题就消失了。
然而,我确实想同时使用两者。
我该如何解决这个问题?
(请不要告诉我这\forLoop
没有任何用处。我知道。我从一个更大的例子中简化了这个例子。)
答案1
默认情况下,xstring
完全扩展其命令的参数;因此ø
变成其 LaTeX 内部字符表示,并且\forLoop
对其执行不会成功。
请参阅以下示例:
\documentclass{memoir}
\usepackage[utf8]{inputenc}
\usepackage[T1]{fontenc}
\usepackage{forloop}
\usepackage{xstring}
\usepackage{makeidx}
\makeindex
\StrCut{skøn|skat}{|}\pa\pb
\noexpandarg
\StrCut{skøn|skat}{|}\qa\qb
\begin{document}
\texttt{\meaning\pa}
\texttt{\scantokens\expandafter{\meaning\qa}}
\newcounter{ct}
\forLoop{1}{1}{ct}{
\index{\qa}
}
\printindex
\end{document}
产生以下输出:
请注意,\scantokens\expandafter
只是为了恢复 UTF-8 字符,因此ø
被打印;在之前使用\meaning
不会产生任何效果。
因此,好好利用\noexpandarg
并快乐地生活吧。
forloop
没有或 的不同解决方案xstring
。如果不知道如何处理这些列表,则很难提出完整的解决方案,但这应该可以给出一个想法。
\documentclass{memoir}
\usepackage[utf8]{inputenc}
\usepackage[T1]{fontenc}
\usepackage{xparse}
\usepackage{makeidx}
\makeindex
\ExplSyntaxOn
\NewDocumentCommand{\managelist}{ O{\use:n} m }
{
\ozicz_managelist:nn { #1 } { #2 }
}
\seq_new:N \l__ozicz_split_list_seq
\cs_new_protected:Npn \ozicz_managelist:nn #1 #2
{
\seq_set_split:Nnn \l__ozicz_split_list_seq { | } { #2 }
\seq_map_inline:Nn \l__ozicz_split_list_seq { #1 { ##1 } }
}
\ExplSyntaxOff
\newcommand{\printitem}[1]{#1 }
\begin{document}
\managelist{skøn|skat}
\managelist[\printitem]{skøn|skat}
\managelist[\index]{skøn|skat}
\printindex
\end{document}
默认情况下,\managelist
只打印项目,项目之间不带空格(当然,这可以更改)。如果使用可选参数,则每个项目都将成为其中宏的参数。
这是.idx
文件:
\indexentry{sk\IeC {\o }n}{1}
\indexentry{skat}{1}
\IeC {\o }
当条目在成为的参数之前被处理时,这是正常的\index
。