测试代码

测试代码

在下面的 MWE 中,我定义了两种listings语言(bluelangredlang),每种语言都有一个foo关键字,但来自不同的列表:

  • 前者排名第一,
  • 后者排名第二。

奇怪的是,如果在某个时候foo从列表 1 中删除(使用\lstset{deletekeywords=[1]{foo}}),foo那么从列表 2 中删除也会被删除:有必要foo从列表 2 中重新定义(使用\lstset{morekeywords=[2]{foo}})以覆盖此删除。

因此我的问题是:为什么deletekeywords=[1]{foo}删除foo由定义的关键字morekeywords=[2]{foo}

\documentclass{article}
\usepackage{listings}
\usepackage{xcolor}

\lstdefinelanguage{bluelang}{
  morekeywords=[1]{foo,bar}
}

\lstdefinelanguage{redlang}{
  morekeywords=[2]{foo,baz}
}%

\lstset{%
  alsolanguage=bluelang,
  alsolanguage=redlang,
  keywordstyle={[1]\color{blue}},
  keywordstyle={[2]\color{red}},
  basicstyle=\ttfamily,
}%

\begin{document}
\begin{lstlisting}
foo bar baz
\end{lstlisting}
%
\lstset{deletekeywords=[1]{foo}}
%
\begin{lstlisting}
foo bar baz
\end{lstlisting}
%
\lstset{morekeywords=[2]{foo}}
%
\begin{lstlisting}
foo bar baz
\end{lstlisting}
\end{document}

答案1

我的评论不正确。事实是,据我所知,lstlisting仅当您输入或 时才会清理其内存\lstinline

也就是说,你可以像more这样玩delete

\lstset{
    morekeywords=[4]{foo},
    morekeywords=[3]{foo},
    morekeywords=[2]{foo},
    morekeywords=[1]{foo}
}
\lstset{
    deletekeywords=[4]{foo}, % [4] deleted
    deletekeywords=[2]{foo}  % [2] deleted
}
\lstinline{foo} % [3] wins; [1] deleted automatically

然后将分配foo给类别 3,因为这是第一个未取消的类别分配。然后所有与类别 1 有关的数据将被自动删除。

但是如果你输入\lstinline从中间进入,那么将分配bar给类别 1,并删除与类别 3、2、1 有关的所有数据。请注意,此时bar内存中只有一个副本。因此,稍后当您尝试删除时,bar您将从任何类别中删除它。

\lstset{
    morekeywords=[4]{bar},
    morekeywords=[3]{bar},
    morekeywords=[2]{bar},
    morekeywords=[1]{bar}
}
\lstinline{bar} % [4] wins; [3][2][1] deleted automatically
\lstset{
    deletekeywords=[3]{bar}, % nothing to delete
    deletekeywords=[2]{bar}  % nothing to delete
}
\lstinline{bar} % delete all styling whatsoever

测试代码

\documentclass{article}
\usepackage{listings}
\usepackage{xcolor}

\begin{document}

\lstset{
    basicstyle={\ttfamily\Huge[x]},
    keywordstyle={[1]\Huge[1]\color{blue}},
    keywordstyle={[2]\Huge[2]\color{red}},
    keywordstyle={[3]\Huge[3]\color{green}},
    keywordstyle={[4]\Huge[4]\color{yellow}}
}





\lstset{
    morekeywords=[4]{foo},
    morekeywords=[3]{foo},
    morekeywords=[2]{foo},
    morekeywords=[1]{foo}
}
\lstset{
    deletekeywords=[4]{foo}, % [4] deleted
    deletekeywords=[2]{foo}  % [2] deleted
}
\lstinline{foo} % [3] wins; [1] deleted automatically





\lstset{
    morekeywords=[4]{bar},
    morekeywords=[3]{bar},
    morekeywords=[2]{bar},
    morekeywords=[1]{bar}
}
\lstinline{bar} % [4] wins; [3][2][1] deleted automatically
\lstset{
    deletekeywords=[3]{bar}, % nothing to delete
    deletekeywords=[2]{bar}  % nothing to delete
}
\lstinline{bar} % delete all styling whatsoever





\end{document}

真实的故事

更深层次的答案是,无论何时你进入lstlisting\lstinline 将创建一个名为的宏,根据课程分配\lstk@bar记住应该的风格。bar

然后当你尝试删除bar然后当你尝试从特定类中虽然会记住关键字所分配到的类,但它不会利用此信息。相反,它会删除样式宏\lstk@bar

测试代码

\documentclass{article}
\usepackage{listings}
\usepackage{xcolor}
\usepackage{tabto}
\NumTabs{3}

\begin{document}

\makeatletter
\ttfamily
\def\@nametrace#1 {%
    \textbackslash#1\tab\expandafter\meaning\csname#1\endcsname
}
\def\traceall{
    \hrule height4pt\noindent
    \@nametrace lstk@foo           \\
    \@nametrace lstk@bar           %\\
%   \@nametrace lst@keywords@data  
    \hrule\noindent
%   \@nametrace lst@keywords@list  \\
    \@nametrace lst@keywords       \\
%   \@nametrace lst@keywords@also  \\
%   \@nametrace lst@gkeywords@list \\
    \@nametrace lst@gkeywords      %\\
%   \@nametrace lst@gkeywords@sty  \\
%   \@nametrace lst@keywordstyle   \\
    \hrule\noindent
%   \@nametrace lst@keywords2@list  \\
    \@nametrace lst@keywords2       \\
%   \@nametrace lst@keywords2@also  \\
%   \@nametrace lst@gkeywords2@list \\
    \@nametrace lst@gkeywords2      %\\
%   \@nametrace lst@gkeywords2@sty  \\
%   \@nametrace lst@keywordstyle2  
    \hrule\noindent
%   \@nametrace lst@keywords3@list  \\
    \@nametrace lst@keywords3       \\
%   \@nametrace lst@keywords3@also  \\
%   \@nametrace lst@gkeywords3@list \\
    \@nametrace lst@gkeywords3      %\\
%   \@nametrace lst@gkeywords3@sty  \\
%   \@nametrace lst@keywordstyle3   
    \hrule\noindent
%   \@nametrace lst@keywords4@list  \\
    \@nametrace lst@keywords4       \\
%   \@nametrace lst@keywords4@also  \\
%   \@nametrace lst@gkeywords4@list \\
    \@nametrace lst@gkeywords4      %\\
%   \@nametrace lst@gkeywords4@sty  \\
%   \@nametrace lst@keywordstyle4   
    \hrule height4pt
}

\lstset{
    basicstyle={\ttfamily\Huge[x]},
    keywordstyle={[1]\Huge[1]\color{blue}},
    keywordstyle={[2]\Huge[2]\color{red}},
    keywordstyle={[3]\Huge[3]\color{green}},
    keywordstyle={[4]\Huge[4]\color{yellow}}
}

add foo to four classes
\lstset{
    morekeywords=[4]{foo},
    morekeywords=[3]{foo},
    morekeywords=[2]{foo},
    morekeywords=[1]{foo}
}
\traceall
and delete from some classes
\lstset{
    deletekeywords=[4]{foo},
    deletekeywords=[2]{foo},
}
\traceall
\lstinline{foo}
\traceall

\clearpage

add bar to four classes
\lstset{
    morekeywords=[4]{bar},
    morekeywords=[3]{bar},
    morekeywords=[2]{bar},
    morekeywords=[1]{bar}
}
\traceall
\lstinline{bar}
\traceall
delete bar from some classes
\lstset{
    deletekeywords=[4]{bar},
    deletekeywords=[2]{bar}
}
\traceall
\lstinline{bar}
\traceall

\clearpage

firstly, delete
\lstset{
    deletekeywords=[3]{bar}
}
and then add
\lstset{
    morekeywords=[4]{bar},
    morekeywords=[3]{bar},
    morekeywords=[2]{bar},
    morekeywords=[1]{bar}
}
and then delete
\lstset{
    deletekeywords=[4]{bar},
    deletekeywords=[2]{bar}
}
and then add
\lstset{
    morekeywords=[4]{bar}
}
\traceall
\lstinline{bar}
\traceall

\end{document}

相关内容