classicthesis StrSubstitute 和重音字符

classicthesis StrSubstitute 和重音字符

我在 classicthesis、StrSubstitute 和重音字符之间遇到了“二阶”不兼容问题。以下是 MWE:

\documentclass[italian]{article}
\usepackage[utf8]{inputenc}
\usepackage[nochapters]{classicthesis}
\usepackage{xstring}

\begin{document}
Il modello associa un valore di \StrSubstitute{verità}{x}{y}\
ad ogni formula.
\end{document}

编译出现以下错误:

! Argument of \MT@res@a has an extra }.

但是如果我删除 classicthesis 包,或者删除 StrSubstitute 命令或删除重音字符:那么编译就可以正常工作!

答案1

xstring函数使用\edef,这意味着任何不能通过纯扩展工作的命令都可能失败。使用这个简化的输入,你会得到同样的错误

\documentclass[italian]{article}
\usepackage[utf8]{inputenc}
\usepackage{microtype}


\begin{document}
Il modello associa un valore di 
\edef\foo{verità}

ad ogni formula.
\end{document}

你可以使用

 {\def\protect{\noexpand\protect\noexpand}\StrSubstitute{verità}{x}{y}}

这不会出错,但会删除重音,根据实际需求,使用可扩展字符串替换函数而不是 xstring 可能是最简单的。

例如,用 y 替换 x,同时保留重音 a

\documentclass[italian]{article}
\usepackage[utf8]{inputenc}
\usepackage{microtype}
\usepackage{xparse}
\ExplSyntaxOn
\NewDocumentCommand\repl{mmm}
 {
  \tl_set:Nn \l_tmpa_tl { #1 }
  \regex_replace_once:nnN { #2 } { #3 } \l_tmpa_tl
  \tl_use:N \l_tmpa_tl
 }
\ExplSyntaxOff

\begin{document}
Il modello associa un valore di \repl{vxerità}{x}{y}
ad ogni formula.
\end{document}

答案2

正如您所发现的,问题在于\StrSubstitute执行\edef其参数。然而,这是可以避免的。

\documentclass[italian]{article}
\usepackage[utf8]{inputenc}
\usepackage[nochapters]{classicthesis}
\usepackage{xstring}

\begin{document}

Il modello associa un valore di
\saveexpandmode\noexpandarg
\StrSubstitute{virità}{i}{e}
\restoreexpandmode\
ad ogni formula.

\bigskip

\saveexpandmode\noexpandarg
\StrSubstitute{viritò}{ò}{à}
\restoreexpandmode\

\end{document}

如果您永远不需要其他模式(查看手册第 3.1.1 节),您可以\noexpandarg在序言中发出,而不必保存和恢复它。

一种更简单的方法可能是使用一种expl3实现(当前classicthesis会引发一个错误,但您可以放心地忽略它)。

\documentclass[italian]{article}
\usepackage[utf8]{inputenc}
\usepackage[nochapters]{classicthesis}
\usepackage{xparse}

\ExplSyntaxOn
\NewDocumentCommand{\xStrSubstitute}{mmmo}
 {
  \tl_set:Nn \l_tmpa_tl { #1 }
  \tl_replace_all:Nnn \l_tmpa_tl { #2 } { #3 }
  \IfNoValueTF{#4}
   { \tl_use:N \l_tmpa_tl }
   { \tl_set_eq:NN #4 \l_tmpa_tl }
 }
\ExplSyntaxOff

\begin{document}

Il modello associa un valore di
\xStrSubstitute{virità}{i}{e}\
ad ogni formula.

\bigskip

\xStrSubstitute{viritò}{ò}{à}

\end{document}

在此处输入图片描述

答案3

listofitems去救援。

\documentclass[italian]{article}
\usepackage[utf8]{inputenc}
\usepackage[nochapters]{classicthesis}
\usepackage{listofitems}
\newcommand\loiStrSubstitute[3]{%
  \setsepchar{#2}%
  \readlist\mylist{#1}%
  \foreachitem\x\in\mylist{\ifnum\xcnt=1\else#3\fi\x}%
}
\begin{document}
Il modello associa un valore di \loiStrSubstitute{verità}{e}{x}\
ad ogni formula.

\loiStrSubstitute{verità}{à}{x}

\loiStrSubstitute{verititità}{i}{o}
\end{document}

在此处输入图片描述

如果你需要一个只替换第一次出现的宏的星型版本,

\documentclass[italian]{article}
\usepackage[utf8]{inputenc}
\usepackage[nochapters]{classicthesis}
\usepackage{listofitems}
\makeatletter
\newcommand\loiStrSubstitute{%
  \@ifstar{\loiStrSubstitutefirst}{\loiStrSubstituteall}}
\makeatother
\newcommand\loiStrSubstituteall[3]{%
  \setsepchar{#2}%
  \readlist\mylist{#1}%
  \foreachitem\x\in\mylist{\ifnum\xcnt=1\else#3\fi\x}%
}
\newcommand\loiStrSubstitutefirst[3]{%
  \setsepchar{#2}%
  \readlist\mylist{#1}%
  \foreachitem\x\in\mylist{\ifnum\xcnt=1\else\ifnum\xcnt=2\relax#3\else#2\fi\fi\x}%
}
\begin{document}
Il modello associa un valore di \loiStrSubstitute{verità}{e}{x}\
ad ogni formula.

\loiStrSubstitute{verità}{à}{x}

\loiStrSubstitute{verititità}{i}{o}

\loiStrSubstitute*{verititità}{i}{o}
\end{document}

在此处输入图片描述

相关内容