如何扩展 fancyref 以用于列表?

如何扩展 fancyref 以用于列表?

我用的是列表环境来格式化源代码,例如 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(默认启用)名为 not mainbut plain

  • \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}

在此处输入图片描述

相关内容