我想创建一个宏,使用 来排版参数,并创建一个具有该名称的标签。我的名字包含下划线,所以我尝试从包中\emph
使用:\StrSubstitute
xstring
\documentclass{article}
\usepackage{xstring}
\newcommand{\tactic}[1]{
\label{\StrSubstitute{#1}{\_}{}}
\emph{#1}
}
\begin{document}
\tactic{EXISTS_TAC}
\end{document}
但我明白
! Use of \@xs@StrSubstitute@@ doesn't match its definition.
\kernel@ifnextchar ...d@d =#1\def \reserved@a {#2}
\def \reserved@b {#3}\futu... l.12
\tactic{EXISTS_TAC}
我怎样才能解决这个问题?
答案1
答案2
这是一个基于 LuaLaTeX 的解决方案。
\documentclass{article}
\usepackage{luacode} % for 'luacode' env. and '\luastringN' macro
\begin{luacode}
function tactic ( s )
tex.sprint ( "\\label{"..s.."}" )
tex.sprint ( "\\emph{\\detokenize{"..s.."}}" )
end
\end{luacode}
\newcommand\tactic[1]{\directlua{tactic(\luastringN{#1})}}
\begin{document}
\tactic{EXISTS_TAC} \quad \tactic{_^&@$<>}
\end{document}
答案3
您不需要从引用标签名称中删除下划线,但如果您坚持:
\documentclass{article}
\usepackage{xstring}
\usepackage{textcomp}
\newcommand{\tactic}[1]{%
\begingroup
\let\textunderscore=\relax
\StrSubstitute{#1}{_}{\textunderscore}[\mytemp]%
\expandafter\endgroup
\expandafter\emph
\expandafter{\mytemp}%
\begingroup
\StrSubstitute{#1}{_}{}[\mytemp]%
\expandafter\endgroup
\expandafter\label
\expandafter{\mytemp}%
}%
\begin{document}
\tactic{EXISTS_TAC} \pageref{EXISTSTAC}
\end{document}
请注意,如果使用超链接-package\label
不会为超链接放置锚点,并且您的\tactic
-command 在任何情况下都不会通过任何计数器进行更改,\refstepcounter
因此引用标签 via\ref
或\nameref
或\autoref
将导致引用分段的上级项。\pageref
将提供相应 -command 输出所在页面的页码\tactic
。