![Verwenden von \StrSubstitute in einer Makrodefinition](https://rvso.com/image/391703/Verwenden%20von%20%5CStrSubstitute%20in%20einer%20Makrodefinition.png)
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 \emph
zu verwenden :\StrSubstitute
xstring
\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}
Antwort2
Hier ist eine auf LuaLaTeX basierende Lösung.
\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}
Beachten Sie, dass bei der Verwendung derHyperref-Paket \label
keinen Anker für Hyperlinks setzt und dass Ihr \tactic
-Befehl auf keinen Fall einen Zähler verändert, \refstepcounter
so dass eine Referenzierung der Bezeichnung über \ref
oder \nameref
oder \autoref
zur Referenzierung des übergeordneten Elements der Unterteilung führt. \pageref
liefert die Seitenzahl der Seite, auf der die Ausgabe des entsprechenden \tactic
-Befehls erfolgt.