如何在不删除现有文字替换的情况下定义额外的文字替换?

如何在不删除现有文字替换的情况下定义额外的文字替换?

我正在尝试改进随附的一些语言定义listings。这些改进包括以下几点:有文化的替代者(参见手册的第 5.4 小节listings)用于改变我用来跟踪上下文(注释、字符串等)的开关和计数器的值。

literate键(用于执行这些文字替换)具有以下语法:

literate=[*]⟨replacement item⟩...⟨replacement item⟩

其中⟨replacement item⟩由三部分组成:

{⟨stuff to replace⟩}{⟨replacement text⟩}{⟨length⟩}.

但是,listings似乎无法为已经存在的文字替换定义额外的文字替换。因此,如果用户想要使用我的语言定义,但决定定义自己的文字替换(literate第二次使用),则作为我的语言一部分定义的所有文字替换都将被删除,并且我改进的语言语法突出显示将被破坏。

其他键,例如keywords,有一个系统班级,大概是为了避免这种干扰。不幸的是,没有这样的等级制度literate。也没有moreliterate钥匙。

我怎样才能允许用户指定进一步的文字替换而不删除那些已经定义的文字替换?

下面的代码展示了该问题的一个例子:

在此处输入图片描述

\documentclass{article}

\usepackage{listings}

% ----
% (This language definition would be in some mylang package)
\lstdefinelanguage{mylang}
{%
    basicstyle=\ttfamily,
    literate={u}{a}1,
}
% -----

% Now, in his/her preamble, the user loads mylang
% but defines new literate replacements, which delete mine
\lstset
{%
    language=mylang,
    literate={(}{[}1 {)}{]}1,
}

\begin{document}

\noindent I would like to get {\ttfamily[papa]} as output, but I get
\begin{lstlisting}
(pupu)
\end{lstlisting}

\end{document}

答案1

看来您应该能够按照 的思路偷偷带入一个新密钥add to literate。我对 中使用的密钥管理系统不太熟悉listings,所以我可能还是把如何创建这样的密钥留给您自己去想吧。

同时,这里有一个宏和钥匙组合似乎可以实现您想要的目标。

\documentclass{article}

\usepackage{listings}

%%\usepackage{etoolbox}
\makeatletter
\def\addToLiterate#1{\edef\lst@literate{\unexpanded\expandafter{\lst@literate}\unexpanded{#1}}}
\lst@Key{add to literate}{}{\addToLiterate{#1}}
\makeatother

\lstdefinelanguage{mylang}
{%
    basicstyle=\ttfamily,
    literate={u}{a}1,
}

\lstset
{%
    language=mylang,
    add to literate={(}{[}1 {)}{]}1,
}

\begin{document}

\noindent I would like to get {\ttfamily[papa]} as output, but I get
\begin{lstlisting}
(pupu)
\end{lstlisting}

\end{document}

效果如下:

在此处输入图片描述

相关内容