listings
在 LaTeX(或 e-TeX)中是否有办法检查使用包(在定义内部)是否定义了样式\lstnewenvironment
?
我的意思像这样:
\lstdefinestyle{tmpdefaultstyle}{}
\lstdefinestyle{tmpstyle}{}
\lstnewenvironment{tmpenv}{
\ifcsname **********\endcsname
\lstset{style=tmpstyle}
\else
\lstset{style=tmpdefaultstyle}
\fi
}{}
**********
- 我不知道在这里该写什么。
答案1
这是一个解决方案。
在帮助下,\tracingall
我发现该命令会“动态”\lstdefinestyle{<stylename>}{...}
生成一个名称。lststy@<stylename>$
例如,该命令\lstdefinestyle{tmpstyle}{...}
生成lststy@tmpstyle$
。
因此,MWE
\documentclass{article}
\usepackage{listings}
\makeatletter
\lstdefinestyle{tmpdefaultstyle}{keywordstyle=\bfseries,language=[LaTeX]{TeX}}
\lstdefinestyle{tmpstyle}{keywordstyle=\ttfamily,language=[LaTeX]{TeX}}
\lstnewenvironment{tmpenv}{%
\ifcsname lststy@tmpstyle$\endcsname%
\lstset{style=tmpstyle}%
\else%
\lstset{style=tmpdefaultstyle}%
\fi%
}{}
\makeatother
\begin{document}
\begin{tmpenv}
\documentclass{article}
\end{tmpenv}
\end{document}
产量
因为样式tmpstyle
已经定义(并且是用 定义的keywordstyle=\ttfamily
)。
如果你评论这一行
\lstdefinestyle{tmpstyle}{keywordstyle=\ttfamily,language=[LaTeX]{TeX}}
那么样式tmpstyle
就没有定义,你会得到
因为这次使用了样式tmpdefaultstyle
(并且用 定义\keywordstyle=\bfseries
)。