![Usando \StrSubstitute en una definición de macro](https://rvso.com/image/391703/Usando%20%5CStrSubstitute%20en%20una%20definici%C3%B3n%20de%20macro.png)
Me gustaría crear una macro que escriba el argumento usando \emph
y también cree una etiqueta con ese nombre. Mis nombres contienen guiones bajos, así que intenté usarlos \StrSubstitute
desde el xstring
paquete:
\documentclass{article}
\usepackage{xstring}
\newcommand{\tactic}[1]{
\label{\StrSubstitute{#1}{\_}{}}
\emph{#1}
}
\begin{document}
\tactic{EXISTS_TAC}
\end{document}
pero lo entiendo
! 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}
¿Cómo puedo arreglar esto?
Respuesta1
En realidad, tiene el problema inverso: una entrada como \emph{EXISTS_TAC}
generará un error, mientras que \label{EXISTS_TAC}
es completamente segura.
\documentclass{article}
\usepackage{xstring}
\newcommand{\tactic}[1]{%
\emph{\noexpandarg\StrSubstitute{#1}{_}{\_}}\label{#1}%
}
\begin{document}
\tactic{EXISTS_TAC}
It was on page~\pageref{EXISTS_TAC}
\end{document}
Respuesta2
Aquí hay una solución basada en 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}
Respuesta3
No es necesario eliminar los guiones bajos de los nombres de las etiquetas de referencia, pero si insiste:
\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}
Tenga en cuenta que en caso de utilizar elhiperreferencia-package \label
no coloca un ancla para hipervínculos y su \tactic
comando -en cualquier caso no cambia ningún contador vía \refstepcounter
de modo que hacer referencia a la etiqueta vía \ref
o \nameref
o \autoref
conducirá a hacer referencia al elemento superior de sección. \pageref
entregará el número de página de la página donde \tactic
se produce la salida del comando correspondiente.