带有可选参数的 newcommand 显示错误文本

带有可选参数的 newcommand 显示错误文本

我尝试设置一个带有可选参数的新命令。问题是该命令显示“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}}%
}

相关内容