Использование \StrSubstitute в определении макроса

Использование \StrSubstitute в определении макроса

Я хотел бы создать макрос, который набирает аргумент, используя, \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

На самом деле у вас обратная проблема: такой ввод \emph{EXISTS_TAC}вызовет ошибку, тогда как \label{EXISTS_TAC}является совершенно безопасным.

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

введите описание изображения здесь

решение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-команда в любом случае не изменяет счетчик via, \refstepcounterтак что ссылка на метку через \refили \namerefили \autorefприведет к ссылке на вышестоящий элемент секционирования. \pagerefвернет номер страницы, на которой \tacticпроисходит вывод соответствующей -команды.

Связанный контент