在进一步研究我的答案的代码时LaTeX 文学编程的不同方法我遇到了一个问题,我确信有一个非常简单的解决方案,但我却完全想不通。
问题是:我希望能够自动索引宏名称,其中一些将包含字符@
;因此,我需要对它们进行预处理并@
用"@
for替换makeindex
以接受它们。我有一些有效的代码尽管在listings
环境中有效,但在正常环境或命令中使用时无效(我也需要它们)。此外,如果我尝试替换任何正常字母,它在任何地方都有效 - 只有不起作用@
。
因此,我怀疑答案与对 catcodes 进行一些魔法有关listings
,但我想找出它是什么以及如何重现它。
这是最小的(其中我正在重现我的代码的实际结构,以防问题出在那里):
\documentclass{article}
\usepackage{listings,etoolbox,xstring}
\makeatletter
\newcommand{\set@macro@type}[1]{\StrSubstitute{#1}{@}{"@}[\entryname]}
\newcommand{\processtexcs}[1]{\set@macro@type{#1}}
\newcommand{\maketexcs}[1]{\forcsvlist{\par\processtexcs{#1}}\entryname}
\makeatother
\lstnewenvironment{code}[1]
{\maketexcs{#1}}
{}
\newenvironment{notcode}[1]
{\maketexcs{#1}}
{}
\newcommand{\command}[1]{\maketexcs{#1}}
\begin{document}
\begin{code}{my@first@macro}
\end{code}
\begin{notcode}{my@second@macro}
\end{notcode}
\command{my@third@macro}
\end{document}
(请注意,如果您将中的@
替换为 ,那么一切都会正常。)y
\StrSubstitute
答案1
它是你的类别代码上的魔法。:)
@
您正在类别代码为 11 的上下文中定义主宏;但是当您使用它时,\StrSubstitute
找不到类别代码 11 @
。使用
\newcommand{\setmacrotype}[1]{\StrSubstitute{#1}{@}{"@}[\entryname]}
\newcommand{\processtexcs}[1]{\setmacrotype{#1}}
\newcommand{\maketexcs}[1]{\forcsvlist{\par\processtexcs{#1}}\entryname}
沒有任何\makeatletter
。
如果你在.cls
或.sty
文件中并且想要保留内部名称\set@macro@type
,那么
\begingroup\lccode`?=`@ \lowercase{\endgroup
\newcommand{\set@macro@type}[1]{\StrSubstitute{#1}{?}{"?}[\entryname]}
}
即可。该操作将把(类别代码为 12)\lowercase
转换为类别代码为 12?
@
前处理\endgroup
和\newcommand
。只有字符标记会受到的影响\lowercase
,因此可能更改的标记列表是,{[1]#}?"
并且只有?
(在默认设置下)才会根据先前的分配“小写”。