Usando \StrSubstitute en una definición de macro

Usando \StrSubstitute en una definición de macro

Me gustaría crear una macro que escriba el argumento usando \emphy también cree una etiqueta con ese nombre. Mis nombres contienen guiones bajos, así que intenté usarlos \StrSubstitutedesde el xstringpaquete:

\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}

ingrese la descripción de la imagen aquí

Respuesta2

Aquí hay una solución basada en LuaLaTeX.

ingrese la descripción de la imagen aquí

\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}

ingrese la descripción de la imagen aquí

Tenga en cuenta que en caso de utilizar elhiperreferencia-package \labelno coloca un ancla para hipervínculos y su \tacticcomando -en cualquier caso no cambia ningún contador vía \refstepcounterde modo que hacer referencia a la etiqueta vía \refo \namerefo \autorefconducirá a hacer referencia al elemento superior de sección. \pagerefentregará el número de página de la página donde \tacticse produce la salida del comando correspondiente.

información relacionada