我用的是列表环境来格式化源代码,例如 JSON 文件。
\begin{lstlisting}[label={lst:json-example},caption=A JSON example]
{
"title" : "JSON specification",
"author" : "Douglas Crockford",
"mimeType" : "application/json",
"published" : "July 2006",
"reference" : "http://tools.ietf.org/html/rfc4627"
}
\end{lstlisting}
为了在文本中引用列表,我想使用花哨的我用它处理图片、表格、章节等时效果很好。但是,我注意到它不处理列表。
从文档我设法弄清楚了如何定义基本扩展,正如您在这个问题底部的 MWE 中所看到的那样。
您可能知道,fancyref
浮动环境(例如图表、章节等)会增添一些魔力。当参考位于另一页时,参考文本会自动更改。
chapter 1 on the following page
Chapter 1 on the previous page
figure 1 on the facing page
Figure 1 on the page before
我如何增强上述扩展以自动提供那些魔术参考?
这是一个用于测试行为的 MWE。
\documentclass{scrreprt}
\usepackage{fancyref}
\usepackage{listings}
% ---------------------------------------------------------------
% Listing extension for fancyref using the prefix "lst".
% ---------------------------------------------------------------
\newcommand*{\fancyreflstlabelprefix}{lst}
% Main format
\frefformat{main}{\fancyreflstlabelprefix}{%
\MakeUppercase{\freflstname}\fancyrefdefaultspacing#1#2%
}%
\Frefformat{main}{\fancyreflstlabelprefix}{%
\MakeUppercase{\Freflstname}\fancyrefdefaultspacing#1#2%
}%
\Frefformat{main}{\fancyreflstlabelprefix}{Listing~#1}
\frefformat{main}{\fancyreflstlabelprefix}{listing~#1}
% Vario format
\frefformat{vario}{\fancyreflstlabelprefix}{%
\MakeUppercase{\freflstname}\fancyrefdefaultspacing#1#2%
}%
\Frefformat{vario}{\fancyreflstlabelprefix}{%
\MakeUppercase{\Freflstname}\fancyrefdefaultspacing#1#2%
}%
\Frefformat{vario}{\fancyreflstlabelprefix}{Listing~#1 on page #2}
\frefformat{vario}{\fancyreflstlabelprefix}{listing~#1 on page #2}
\begin{document}
I want to refer to a \fref{lst:example-1} and to a \fref{lst:example-2}.
\begin{lstlisting}[label={lst:example-1},caption=A first example]
{
"name" : "Listing 1"
}
\end{lstlisting}
\pagebreak
\begin{lstlisting}[label={lst:example-2},caption=A second example]
{
"name" : "Listing 2"
}
\end{lstlisting}
\end{document}
答案1
必须纠正以下几点:
该选项的对应选项
vario
(默认启用)名为 notmain
butplain
。\frefformat{plain}
,\frefformat{vario}
并且它们的大写变体应该只定义一次\fancyreflstlabelprefix
(第二个定义只是覆盖第一个定义),并且它们应该根据其他元素的适当的相应定义进行建模。\frefformat{vario}
必须使用第一个和第三基本论点(#1#3
)。\freflstname
并且\Freflstname
必须为所有文档语言定义(例如:英语)。\fancyrefdefaultspacing
总是使用~
(默认情况下它指向它)。
\documentclass{scrreprt}
\usepackage{fancyref}% option `vario` is default
\usepackage{listings}
\newcommand*{\fancyreflstlabelprefix}{lst}
\fancyrefaddcaptions{english}{%
\providecommand*{\freflstname}{listing}%
\providecommand*{\Freflstname}{Listing}%
}
\frefformat{plain}{\fancyreflstlabelprefix}{\freflstname\fancyrefdefaultspacing#1}
\Frefformat{plain}{\fancyreflstlabelprefix}{\Freflstname\fancyrefdefaultspacing#1}
\frefformat{vario}{\fancyreflstlabelprefix}{%
\freflstname\fancyrefdefaultspacing#1#3%
}
\Frefformat{vario}{\fancyreflstlabelprefix}{%
\Freflstname\fancyrefdefaultspacing#1#3%
}
\begin{document}
I want to refer to a \fref{lst:example-1}, to a \fref{lst:example-2}, and to a
\fref{lst:example-3}.
\begin{lstlisting}[label={lst:example-1},caption=A first example]
{
"name" : "Listing 1"
}
\end{lstlisting}
\clearpage
\begin{lstlisting}[label={lst:example-2},caption=A second example]
{
"name" : "Listing 2"
}
\end{lstlisting}
\clearpage
\begin{lstlisting}[label={lst:example-3},caption=A third example]
{
"name" : "Listing 3"
}
\end{lstlisting}
\end{document}