![Использование \StrSubstitute в определении макроса](https://rvso.com/image/391703/%D0%98%D1%81%D0%BF%D0%BE%D0%BB%D1%8C%D0%B7%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5%20%5CStrSubstitute%20%D0%B2%20%D0%BE%D0%BF%D1%80%D0%B5%D0%B4%D0%B5%D0%BB%D0%B5%D0%BD%D0%B8%D0%B8%20%D0%BC%D0%B0%D0%BA%D1%80%D0%BE%D1%81%D0%B0.png)
Я хотел бы создать макрос, который набирает аргумент, используя, \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
происходит вывод соответствующей -команды.