makeidx、xstring、forloop 和 utf8 冲突

makeidx、xstring、forloop 和 utf8 冲突

我在字符串中使用丹麦语字符,这些字符串是\StrCut从包中拆分出来的,并在包中×string使用。结果并不好。\forLoopforloop

考虑这个小例子:

\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

相关内容