我在 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}