我是法国人,我想在使用 Stringstrings 命令时管理重音字符。
这是一个 LaTeX 最小示例,向您展示我的问题:
\documentclass[11pt]{article}
\usepackage[T1]{fontenc}
\usepackage[utf8]{inputenc}
\usepackage[french]{babel}
\usepackage{stringstrings}
\begin{document}
\edef\str{Ô opiniâtre salubrité}
1 -- \str
2 -- \substring{\str}{1}{$}
\end{document}
当我编译时,我得到了这个:
我尝试过几件事,包括这个:
\encodetoken{\str}
它起作用了,然后我得到了:“Ô opiniâtre salubrité”,但我无法干预链并修改它。字符串似乎冻结了。例如,使用如下语句:
\Treatments{}{}{}{}{}{0} \substring{\str}{1}{$}
根本不要删除空格。
有办法解决这个问题吗?
非常感谢 !
答案1
作为 的很久以前的作者stringstrings
,我可以说这个包有很多限制,写得不好。但是,针对你目前的情况,我想说的是:这个包不处理 unicode 字符,而只处理那些构造为 的字符\^O opini\^atre salubrit\'e
。其次,包宏的参数,例如\substring
不能是宏,而必须是文本。如果你有宏形式,你必须预先展开它,就像我在下面的情况 3 中所做的那样。
\documentclass[11pt]{article}
\usepackage[T1]{fontenc}
\usepackage[utf8]{inputenc}
\usepackage[french]{babel}
\usepackage{stringstrings}
\begin{document}
\edef\str{Ô opiniâtre salubrité}
1 -- \str
\def\strB{\^O opini\^atre salubrit\'e}
2 -- \substring{\^O opini\^atre salubrit\'e}{1}{$}
3 -- \expandafter\substring\expandafter{\strB}{1}{$}
\end{document}
答案2
\newcommand
如果您使用而不是,您的代码大部分情况下都可以正常工作\edef
。请注意,无论如何,您可能\newcommand
大多数时候都应该使用 ,因为它会检查以确保命令尚未定义。由于\str
是一个相当常见的 3 个字母的名称,因此它可能是由某个包定义的,它\def
会覆盖。
我说大多有效,因为这是我的输出:
stringstrings
似乎不喜欢这个é
角色。
另一方面,该包xstring
对重音字符没有任何问题:
命令不同。xstring
使用\StrMid
代替\substring
,并且xstring
(据我所知)没有$
快捷方式。但您可以使用任何比字符串长度更长的数字。xstring
具有与 相同的许多功能,stringstrings
因此您很可能可以切换。软件包文档提供法语和英语版本:https://www.ctan.org/pkg/xstring
\documentclass[11pt]{article}
\usepackage[T1]{fontenc}
\usepackage[utf8]{inputenc}
\usepackage[french]{babel}
%\usepackage{stringstrings}
\usepackage{xstring}
\newcommand{\str}{Ô opiniâtre salubrité}
\begin{document}
1 -- \str
2 -- \StrMid{\str}{1}{40}
\end{document}