如何在没有 XeTeX 的情况下添加数字(ala No Starch Press)列表注释?

如何在没有 XeTeX 的情况下添加数字(ala No Starch Press)列表注释?

我一直遵循以下说明和代码: https://zuttobenkyou.wordpress.com/2010/12/05/latex-saner-source-code-listings-no-starch-press-style/

我想在与 No Starch Press 出版物类似的 lstlisting 环境中添加注释(和样式):

最优输出

不幸的是,它依赖于 XeTeX,并且我在我的文档中添加了对它的条件支持,但这对 pgf/tikx 来说是个问题,因为 xetex 驱动程序不是很完整,而且我对等宽字体(如 DejaVu Sans Mono)也有问题,这会导致(非常)奇怪的无效字距调整。

如何使用类似的方法对 notes 和 pdftex 进行处理来避免对 xetex 的依赖?

更新:检查我的答案,了解基于 tikz 的解决方案,支持无限的侧注。

感谢 Mike Renfro 的意见!

答案1

虽然不完美,但它在某个子集上可能对你来说足够了。使用综合 LaTeX 符号列表扫描带圈的数字等:

在此处输入图片描述

\documentclass{article}
\usepackage[x11names]{xcolor} % for a set of predefined color names, like LemonChiffon1
\usepackage{listings}
\usepackage{textcomp}
\newcommand{\numold}[1]{\oldstylenums{#1}}

% Allow "No Starch Press"-like custom line numbers (essentially, bulleted line
% numbers for only those lines the author will address)
\usepackage{pifont}
\usepackage{ifthen}
\newcounter{lstNoteCounter}
\newcommand{\lnnum}[1]{% Print pifont circled number for line label
\ifcase#1%
% nothing for 0
\or\ding{202}%
\or\ding{203}%
\or\ding{204}%
\or\ding{205}%
\or\ding{206}%
\or\ding{207}%
\or\ding{208}%
\or\ding{209}%
\or\ding{210}%
\or\ding{211}%
\else{NUM TOO HIGH}%
\fi%
}
\newcommand*{\lnote}{%
\stepcounter{lstNoteCounter}\vbox{\llap{{\lnnum{\thelstNoteCounter}}\hskip 1em}}%
}
\lstnewenvironment{csource2}[1][]
{
    \setcounter{lstNoteCounter}{0}
    \lstset{basicstyle=\ttfamily,language=C,numberstyle=\numold,numbers=right,
            frame=lines,framexleftmargin=0.5em,framexrightmargin=0.5em,
            backgroundcolor=\color{LemonChiffon1},showstringspaces=false,
            escapeinside={(*@}{@*)},#1}
}
{}

\begin{document}
\section{Hello, world!}
The following program \texttt{hello.c} simply prints ``Hello, world!'':

\begin{csource2}
(*@\lnote@*)#include <stdio.h>

/* This is a comment. */
(*@\lnote@*)int main()
{
(*@\lnote@*)    printf("Hello, world!\n");
(*@\lnote@*)    return 0;
}
\end{csource2}

We first include the \texttt{stdio.h} header file \lnnum{1}. We then declare
the \texttt{main} function \lnnum{2}. We then print ``Hello, world!'' to
standard output (a.k.a., \textit{STDOUT}) \lnnum{3}. Finally, we return value
0 to let the caller of this program know that we exited safely without any
errors \lnnum{4}.
\end{document}

它无法处理超过 10 个带圆圈的数字标签,但可以处理常规的pdflatex。其他人可以为这些标签制作 TikZ 代码,并将其扩展到原始的 20 个标签之外。

答案2

我决定制作自己的基于 tikz 的版本,主要是因为输出的实际质量甚至比可适当缩放的字形还要好。它对您可以添加多少条“注释线”没有限制,并且您可以获得对每个圆圈内排版的细粒度支持。

%\newcommand{\mynumold}[1]{{\addfontfeature{Numbers=OldStyle}#1}}
\newcommand{\mynumold}[1]{{\oldstylenums{#1}}}

\newcounter{lstNoteCounter}

\newcommand*\lnnum[1]{\tikz[baseline=(char.base)]{
            \node[shape=circle,draw,inner sep=0.8pt,
                        fill=black, text=white] (char) { \rmfamily\bfseries\footnotesize#1};}}

\newcommand*{\lnote}{\stepcounter{lstNoteCounter}\llap{{\lnnum{\thelstNoteCounter}}\hskip 6em}}

\lstnewenvironment{annotatedcsource}[1][]
{
    \setcounter{lstNoteCounter}{0}
        \lstset{
            frame=lines,
            framexleftmargin=0.5em,
            framexrightmargin=0.5em,
            basicstyle=\ttfamily\footnotesize,
            numberstyle=\normalsize\itshape\mynumold,
            backgroundcolor=\color{LemonChiffon1},
            showstringspaces=false,
            numbers=left,
            escapeinside={(*@}{@*)},#1}
        }
{}

这是输出:

输出

目前它存在一些问题:

  • 圆圈的大小可能会破坏背景的显示方式。如果背景是白色的,则不会显示出来,但受影响的行与其他行之间的间距无论如何都会受到影响。一种解决方法是将其放大以容纳更多空间,为圆圈文本选择较小的字体大小或类似方法。

另外,抱歉代码块乱码了。请自行查看并调整行距。

更新:我发布了以下问题,寻求如何正确解决对齐问题的答案(到目前为止,我已经通过覆盖功能解决了背景显示问题): 将 tikz 图片放置在列表代码块的左边距

相关内容