50 如何复刻 pgfmanual 中摘录代码与编译效果同时出现的环境(codeexample)

发布于 2025-08-16 21:13:30

在问题: 如何实现 pgfmanual(pgf-tikz 官方手册)中代码与结果共存的效果('side-by-side' code examples)
提出要实现 pgfmanual 中摘录代码与编译效果同时出现的环境(codeexample),在pgfmanual-en-main-preamble.tex 中找到了这个环境,现在我想复刻并且改进这个环境的效果:

  1. 达到已有的效果
  2. 支持正常的代码换行以及换页。(原来的 codeexapmple 环境中代码换行方面不友好,并且不支持代码换页)
  3. 加入可选参数:对摘录代码的部分:加入行号及其样式(行号颜色,字体,背景色等等)。
  4. 加入可选参数:调节摘录代码与编译效果的相对位置,在原环境中:当编译的结果(对 tikz 而言就是图片)的占据的水平距离比较小(比如小于页面宽度的1/3)时,左边是编译结果,右边是摘录代码。否则,上面是编译结果,下面是摘录代码。现在要支持位置互换,也就是可以代码左,结果右,以及代码上,结果下。

目前的进展:

我想到用 tcolorbox 宏包实现,起初用 listings 库的 tcblistings 环境,但发现结果不能"脱离" 代码,也就是输出结果的环境的高度和摘录代码的高度一样(指它们背景所覆盖的区域),但在原环境中,这二者独立。

于是改用 raster 库的 tcbraster 环境,但发现它很难调整代码与结果之间的相对位置(默认情况是上下位置,似乎没有调整的选项)。

最后改用 raster 库的 tcbitemize 环境,但发现如果要使结果对应的彩色盒子的宽度自适应图片宽度,就需要使用 \tcbox 命令,而它不能很好的匹配另一个显示代码的 tcblistings 环境(二者之间的水平间距难调整)并且它们还会产生一部分凸出左右页面边缘的宽度,以下是对应代码:

\documentclass{article}
\usepackage{tcolorbox,tikz,lipsum,showframe}
\tcbuselibrary{listings,skins,raster}

\lstset{
  basicstyle=\ttfamily,
  breaklines=true,
  breakindent=0pt,
  keywordstyle=\color{green!60!blue},
  emph={\draw}, emphstyle=\color{red},
  emph={[2]\node}, emphstyle={[2]\color{blue}},
  emph={[3]tikzpicture}, emphstyle={[3]\color{blue!60}}
}

\begin{document}

\lipsum[1][1-2]

\begin{tcbitemize}[left=-0.1pt, right=-0.1pt, top=-0.1pt, bottom=-0.1pt,boxrule=-0.1pt,colback=white,raster column skip=0mm,raster valign=top,raster before skip=2em, raster after skip=2em,width=\linewidth]

  \tcbitem
  \tcbox[colback=yellow!20, boxrule=-10pt, sharp corners,tcbox width=auto,left=2mm,right=2mm,top=0mm,bottom=0mm]{
    \begin{tikzpicture}
      \draw (0,0) -- (4,0);
      \node at (1.5,0) {A};
    \end{tikzpicture}
  }

  \tcbitem
  \begin{tcblisting}{listing only, colback=blue!20, boxrule=-10pt, sharp corners,left=2mm,right=2mm,top=0mm,bottom=0mm}
    \begin{tikzpicture}
      \draw (0,0) -- (3,0);
      \node at (1.5,0) {A};
    \end{tikzpicture}
  \end{tcblisting}

\end{tcbitemize}

\lipsum[1][1-2]

\end{document}

image.png

可以看到,以上代码高亮也有问题,我希望(原环境)可以高亮命令,比如 \begin, \end, \draw等,但现在只能高亮命令名,反斜杠不支持。如果使用 minted 库,一定程度上可以改进,但 minted 库需要调用 Pygments,编译速度很慢,我希望能规避。

此外,tkzexample 宏包提供的 tkzexample 环境一定程度上支持以上要求,但代码换行和换页不支持。

请问还有什么实现方法?谢谢。

查看更多

关注者
0
被浏览
76
1 个回答
Sagittarius Rover
Sagittarius Rover 15小时前
我要成为Typst糕手/(ㄒoㄒ)/~~

挑个软柿子:

可以看到,以上代码高亮也有问题,我希望(原环境)可以高亮命令,比如 \begin, \end, \draw等,但现在只能高亮命令名,反斜杠不支持。如果使用 minted 库,一定程度上可以改进,但 minted 库需要调用 Pygments,编译速度很慢,我希望能规避

这个问题应该与tcolorboxexample无关,可以参考这个链接.

撰写答案

请登录后再发布答案,点击登录

发布
问题

分享
好友

手机
浏览

扫码手机浏览