StrSubstitute 和 @ \lstnewenvironment 内部和外部

StrSubstitute 和 @ \lstnewenvironment 内部和外部

在进一步研究我的答案的代码时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]#}?"并且只有?(在默认设置下)才会根据先前的分配“小写”。

相关内容