\listoftables 问题:\caption 中有无 caption 包时 \lstinline 和 texcsstyle

\listoftables 问题:\caption 中有无 caption 包时 \lstinline 和 texcsstyle

listings我在表格命令中使用了带有逐字代码的包\caption。当我远离 TeX 命令序列(texcsstyle在 中listings)时,一切都很好,例如当我仅使用标识符时emphstyle

当我使用texcsstyle像 这样的 TeX 命令序列时\lstinline|\newcommand|,我首先必须转义 ,因为我在 的参数中\使用,所以我使用。 (在下面的 MWE 中,我将麻烦的文本包含在命令中,以确认 正确转义后,使用 (蓝色)格式化。)\lstinline\caption\caption{\lstinline|\\newcommand|}\section\newcommandtexcsstyle

但我仍然没有得到满意的结果。具体发生什么取决于我是否加载了包caption

  • 如果不加载该caption包,表格列表中将不显示任何标题。(“1”代表表 1显示,但该行的标题本身只有空文本。)
  • 如果我加载该caption包,则会显示一个标题。但是,(a)\newcommand的格式为basicstyle(红色) 而不是texcsstyle(蓝色),并且 (b)newcommand的显示没有前缀\

我知道以下解决方法:为表格列表指定可选文本:\caption[optional text]{original text}并手动格式化可选文本。

我在问(a)当我使用标识符时,我能否挽救自动正确的行为(使用emph标识符获得的行为)texcs

此外,出于好奇,

(b)为什么加载该caption包可以部分挽救表格列表中空白标题行的彻底失败?

(c)为什么我对 LaTeX 风格有问题,texcsstyle而对其他风格(非 LaTeX 特有)没有问题?

这是我的 MWE:

\documentclass{article}
\usepackage{listings,xcolor}
\usepackage{caption}
\lstset{language=[LaTeX]TeX,%
    basicstyle=\color{red}\ttfamily,%
    emphstyle=\color{green},%
    texcsstyle=*\color{blue},%
    moreemph={mykey}%
    }
\begin{document}
\listoftables
\bigskip
\section{Caption 1 text outside of caption: Emph: \lstinline|mykey|; texcs: \lstinline|\\newcommand|}
\noindent
Caption 1 text outside of caption: Emph: \lstinline|mykey|; texcs: \lstinline|\newcommand|\\
Caption 2 text outside of caption: Only Emph: \lstinline|mykey|
\begin{table}[h]
    \caption{1 Emph: \lstinline|mykey|; texcs: \lstinline|\\newcommand|}
    \begin{tabular}{|c|c|}
    \hline
       x  &  y\\
         \hline
    \end{tabular}
\end{table}
\begin{table}[h]
    \caption{2 Only Emph: \lstinline|mykey|}
    \begin{tabular}{|c|c|}
    \hline
       x  &  y\\
         \hline
    \end{tabular}
\end{table}
\end{document}

加载包后caption我看到: 在此处输入图片描述

当我注释掉该caption包时,表列表如下所示: 在此处输入图片描述

答案1

如果你查看文件,.lot你就会发现问题

\contentsline {table}{\numberline {1}{\ignorespaces 1 Emph: \lstinline |mykey|; texcs: \lstinline | newcommand|\relax }}{1}
\contentsline {table}{\numberline {2}{\ignorespaces 2 Only Emph: \lstinline |mykey|\relax }}{1}

一些命令已被安全地阻止它们扩展,但最终的结果是它被损坏,特别是\\之前的\newcommand\listinlines特殊定义没有生效,因为它被阻止扩展,所以它被写入\lstinline文件lot

最简单的方法可能是隐藏自定义强命令中的列表

\documentclass{article}
\usepackage{listings,xcolor}
\usepackage{caption}
\lstset{language=[LaTeX]TeX,%
    basicstyle=\color{red}\ttfamily,%
    emphstyle=\color{green},%
    texcsstyle=*\color{blue},%
    moreemph={mykey}%
    }
\begin{document}
\DeclareRobustCommand\lstA{\lstinline|\\newcommand|}
\DeclareRobustCommand\lstB{\lstinline|mykey|}
\listoftables
\bigskip
\section{Caption 1 text outside of caption: Emph: \lstinline|mykey|; texcs: \lstinline|\\newcommand|}
\noindent
Caption 1 text outside of caption: Emph: \lstinline|mykey|; texcs: \lstinline|\newcommand|\\
Caption 2 text outside of caption: Only Emph: \lstinline|mykey|
\begin{table}[h]
    \caption{1 Emph: \lstB; texcs: \lstA}
    \begin{tabular}{|c|c|}
    \hline
       x  &  y\\
         \hline
    \end{tabular}
\end{table}
\begin{table}[h]
    \caption{2 Only Emph: \lstB}
    \begin{tabular}{|c|c|}
    \hline
       x  &  y\\
         \hline
    \end{tabular}
\end{table}
\end{document}

相关内容