Verwenden von \StrSubstitute in einer Makrodefinition

Verwenden von \StrSubstitute in einer Makrodefinition

Ich möchte ein Makro erstellen, das das Argument mit setzt und auch ein Label mit diesem Namen erstellt. Meine Namen enthalten Unterstriche, also habe ich versucht, Folgendes aus dem Paket \emphzu verwenden :\StrSubstitutexstring

\documentclass{article}

\usepackage{xstring}

\newcommand{\tactic}[1]{
\label{\StrSubstitute{#1}{\_}{}}
\emph{#1}
}

\begin{document}

\tactic{EXISTS_TAC}

\end{document}

aber ich bekomme

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

Wie kann ich das beheben?

Antwort1

Tatsächlich haben Sie das umgekehrte Problem: Eine Eingabe wie \emph{EXISTS_TAC}führt zu einem Fehler, während \label{EXISTS_TAC}sie völlig sicher ist.

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

Bildbeschreibung hier eingeben

Antwort2

Hier ist eine auf LuaLaTeX basierende Lösung.

Bildbeschreibung hier eingeben

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

Antwort3

Sie müssen die Unterstriche nicht aus den Namen der Referenzlabels entfernen, aber wenn Sie darauf bestehen:

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

Bildbeschreibung hier eingeben

Beachten Sie, dass bei der Verwendung derHyperref-Paket \labelkeinen Anker für Hyperlinks setzt und dass Ihr \tactic-Befehl auf keinen Fall einen Zähler verändert, \refstepcounterso dass eine Referenzierung der Bezeichnung über \refoder \namerefoder \autorefzur Referenzierung des übergeordneten Elements der Unterteilung führt. \pagerefliefert die Seitenzahl der Seite, auf der die Ausgabe des entsprechenden \tactic-Befehls erfolgt.

verwandte Informationen