有没有办法用 替换字符串中的特殊字符\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}