我对某些宏和 § 符号感到困惑。我可以使用 xelatex/lualatex 来处理,但不能使用 pdflatex。
这是我的代码:
\documentclass{article}
\usepackage{fontspec} % <- xelatex/lualatex works
%\usepackage[utf8]{inputenc} % <- pdflatex fails
\usepackage{etoolbox}
\makeatletter
\def\instring#1#2{TT\fi\begingroup
\edef\x{\endgroup\noexpand\in@{#1}{#2}}\x\ifin@}
\makeatletter
\begin{document}
\def\A{§ 2|1:3}
Spilt ``\A{}'' at ``|'':
\DeclareListParser{\dopipedlist}{|}
\edef\B{{\A}}
\renewcommand*{\do}[1]{\item #1}
\begin{itemize}
\expandafter\dopipedlist\B
\end{itemize}
Searching for §:
\if\instring{§}{\A}
Found.
\else
Not found.
\fi
\end{document}
理想情况下,我希望能够\A
使用§
或\textsection
或进行定义\S
,并使其工作,无论使用哪种 *latex 风格。(我知道如果没有 fontspec/inputenc,§ 将无法工作。)
\textsection
通过使用\noexpand\textsection
并转向更强大的xstring 包,我取得了一些成功InSubStr
,但这并不像我想要的那么简洁。\A
是用户提供的,最终用户必须破译 TeX 的错误消息并知道他们需要添加,这似乎是不合理的\noexpand
。
有没有“有效”的解决方案?后端代码乱七八糟也没关系。我更关心的\A
是简单。
最后,\A
可能包含任何内容,尽管我想要检查的唯一奇怪字符instring
是§。
答案1
为了增加趣味性,我进行了定义\itemizelist
,以便将给定的输入拆分为|
(或运行时选择的另一个字符)并添加到\item
各个部分的前面。如果该部分包含§
,则将其打印为红色。
\documentclass{article}
\usepackage{xparse,ifxetex}
\usepackage{xcolor}
\ifxetex
\usepackage{fontspec} % <- xelatex/lualatex works
\else
\usepackage[utf8]{inputenc} % <- pdflatex too
\fi
\usepackage{etoolbox}
\ExplSyntaxOn
\NewDocumentCommand{\itemizelist}{sO{|}m}
{
\IfBooleanTF { #1 }
{
\purton_itemizelist:no { #2 } { #3 }
}
{
\purton_itemizelist:nn { #2 } { #3 }
}
}
\cs_new_protected:Nn \purton_itemizelist:nn
{
\seq_set_split:Nnn \l_tmpa_seq { #1 } { #2 }
\seq_map_inline:Nn \l_tmpa_seq
{
\tl_if_in:nnTF { ##1 } { § }
{
\item \textcolor{red}{##1}
}
{
\item ##1
}
}
}
\cs_generate_variant:Nn \purton_itemizelist:nn { no }
\ExplSyntaxOff
\begin{document}
\def\A{§ 2|1:3}
\begin{itemize}
\itemizelist*{\A}
\itemizelist[;]{2:x;§ 3}
\end{itemize}
\end{document}
这些宏是“引擎不可知的”,因此它们的结果都是相同的。