我尝试设置一个带有可选参数的新命令。问题是该命令显示“st:code”。出了什么问题?提前致谢!
\documentclass[a4paper,twoside,10pt]{report}
\usepackage{etoolbox}
\usepackage{listings}
\lstset{
escapechar = §
}
\newcommand{\lstref}[2][\empty]{
\ifdefequal{#1}{\empty}
{Listing \ref{#1}}
{Zeile \ref{#2} in Listing \ref{#1}}
}
\begin{document}
\begin{lstlisting}[label={lst:code}]
some code §\label{ln:code}§
\end{lstlisting}
Text Text \lstref{lst:code}(works) Text Text \lstref[lst:code]{ln:code}(prints st:code)
\end{document}
答案1
測試\ifdefequal
有錯。
最好使用xparse
它来更好地区分是否存在可选参数。
\documentclass[a4paper,twoside,10pt]{report}
\usepackage{xparse}
\usepackage{listings}
\lstset{
escapechar = §,
}
\NewDocumentCommand{\lstref}{om}{%
\IfNoValueTF{#1}
{Listing \ref{#2}}
{Zeile \ref{#2} in Listing \ref{#1}}%
}
\begin{document}
\begin{lstlisting}[caption=Whatever,label={lst:code}]
some code §\label{ln:code}§
\end{lstlisting}
Reference to the listing only: \lstref{lst:code}
Reference to the line number: \lstref[lst:code]{ln:code}
\end{document}
当然,如果您希望显示该数字,则需要在列表中指定标题。
更好的测试etoolbox
是
\newcommand{\lstref}[2][]{%
\ifblank{#1}
{Listing \ref{#2}}
{Zeile \ref{#2} in Listing \ref{#1}}%
}