我一直遵循以下说明和代码: 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 图片放置在列表代码块的左边距