xstring 中的特殊字符处理

xstring 中的特殊字符处理

我想通过包 xstring 处理一串字符来获取我想要的字符串,这是我的代码:

    \documentclass[12pt,a4paper]{article}
    \usepackage{xstring}

    \begin{document}

    \StrBefore{aaa \bfseries bbb;some other text}{;}[\temp]
\temp

    \end{document}

我想要的输出字符串是“aaa \bfseries bbb”,但代码编译失败。我认为原因是“\bfseries”的存在,字符“\”导致失败。有人能帮我解决这个问题吗?谢谢。

答案1

我希望我明白你想要什么(打印\bfseries结果而不是解释它)。这可以通过使用\string或将其更改为字符串来实现\detokenize。请注意,在默认字体中,如果使用此选项,反斜杠将打印为高刻度。

\documentclass[12pt,a4paper]{article}
\usepackage{xstring}

\begin{document}

\StrBefore{aaa \detokenize{\bfseries} bbb;some other text}{;}[\temp]
\temp\\
\StrBefore{\detokenize{aaa \bfseries bbb;some other text}}{;}[\temp] % works, too
\texttt{\temp}% with \texttt the backslash is printed

\end{document}

在此处输入图片描述

答案2

您需要阻止 \bfseries 的扩展:

\documentclass[12pt,a4paper]{article}
 \usepackage{xstring}

 \begin{document}
 \noexpandarg  
 \StrBefore{aaa  \bfseries bbb;some other text}{;}[\temp]
 \temp

 \end{document}

答案3

这是一个基于 LuaLaTeX 的解决方案。(Lua 有一个非常强大的字符串操作库。)答案是设置一个名为的 LaTeX 宏\StringBefore,它调用一个 Lua 函数来执行实际工作。该宏\StringBefore是可扩展的;它可以作为其他宏的参数,如下面的代码所示。顺便说一句,我假设如果在搜索字符串中找不到第二个参数中的字符,则不应返回任何内容。

在此处输入图片描述

% !TeX program = lualatex
\documentclass{article}
\usepackage{luacode} % for "\luastringN" macro and "luacode" env.
\begin{luacode} 
function string_before ( str, patt ) 
  n = string.find ( str, patt ) 
  if n then -- string.find made (at least) one match...
      tex.sprint ( string.sub ( str, 1, n-1) )
  else   -- no match -> print nothing
      tex.sprint ( "" ) 
  end
end
\end{luacode}
\newcommand\StringBefore[2]{\directlua{ 
    string_before(\luastringN{#1},\luastringN{#2})}}
\begin{document}

\StringBefore{aaa {\bfseries bbb} ccc;some other text}{;}

\newcommand{\temp}{\StringBefore{ddd {\bfseries eee} \emph{ggg} hhh;dummy text}{;}}

\temp

\StringBefore{aaa {\bfseries bbb} ccc;some other text}{u} % no match

zzz
\end{document}

相关内容