使用 StrSubstitute 替换特殊字符

使用 StrSubstitute 替换特殊字符

有没有办法用 替换字符串中的特殊字符\StrSubstitute?例如,我怎样才能使类似的东西\StrSubstitute{#1}{&}{&\bfseries }起作用?

我之所以问这个问题,是因为我试图定义一个宏,使表格中的一行加粗,如下所示

\newcommand{\thead}[1]{\bfseries \StrSubstitute{#1}{&}{&\bfseries }}

这样你就可以在文档中写入

\usepackage{booktabs, xstring}

\newcommand{\thead}[1]{\bfseries \StrSubstitute{#1}{&}{&\bfseries }\\ \toprule}

\begin{document}
\begin{tabular}{cc}\toprule
    \thead{Item & price}\\ \toprule
    foo & 1\\
    bar & 2\\ \bottomrule
\end{tabular}
\end{document}

我注意到这里有一个针对该特定问题的解决方案:将表格第一行全部设为粗体,通过将 替换cc$c^c。我仍然想知道如何用 xstring 包本身替换特殊字符,也许将来有其他用途。此外,有些人可能更喜欢不需要更改cc为的宏。$c^c

答案1

您必须应用\noexpandarg,否则\bfseries将无法生存。您还必须在组结束后延迟扩展,否则 TeX 会发现&太早,在单元\StrSubstitute完成其任务之前就结束它。

\documentclass{article}
\usepackage{booktabs, xstring}

\newcommand{\thead}[1]{%
  \bfseries
  \noexpandarg
  {\StrSubstitute{#1}{&}{&\bfseries }[\temp]\expandafter}\temp
  \\ \midrule
}

\begin{document}
\begin{tabular}{cc}
\toprule
\thead{Item & price}
foo & 1\\
bar & 2\\
\bottomrule
\end{tabular}
\end{document}

在此处输入图片描述

答案2

如果您愿意并且能够使用 LuaLaTeX 编译 LaTeX 文档,这里有一个利用 Lua 一些强大的字符串函数的解决方案。(用户宏称为\boldrow;该名称\thead可能与“makecell 包”的宏冲突。)

在此处输入图片描述

% !TeX program = lualatex
\documentclass{article}
\usepackage{booktabs}
\usepackage{luacode} % for 'luacode' environment and '\luastringN' macro 
\begin{luacode}
function boldrow ( s )
  tex.sprint ( "\\bfseries " .. string.gsub ( s , "&" , "&\\bfseries" ) )
end
\end{luacode}
\newcommand\boldrow[1]{\directlua{boldrow(\luastringN{#1})}}

\begin{document}
\begin{tabular}{cc}
  \toprule
  \boldrow{Item & price}\\ 
  \midrule
  foo & 1\\
  bar & 2\\ 
  \bottomrule
\end{tabular}
\end{document}

相关内容