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

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

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

目前的进展:

用 tcolorbox 实现,先实现左边图片(编译结果),右边摘录代码的情况:
(为了简化问题,此处省掉代码,下面有构造思路与主要问题)
image.png

思路:输出一个tcblisting 环境,给出适当宽度,右对齐,在这个 tcblisting 环境左边合适位置,用 frame code 选项增加一个 node,里面放置要编译的代码,用 \tcbox (因为它的 width可以 auto)。 其中 tcblisting 环境的 width 是根据左边图片的宽度变化而变化,这就需要测量左边图片的宽度,保存为 \graphwidth.

对于这种情况的问题是:如何封装它为一个环境. 我想到用类似一个自定义环境的命令,带三个参数,#1是普通参数,接受编译内容;#2一个是摘录参数,接受摘录代码(注意 tcblisting 环境内直接用 #2 会被作为摘录代码,从而报错);#3是普通参数,用于输入被测量的编译结果。 而这三个参数实际上接受的值一样,只是性质不一样。用户层面是输入一段代码,然后分配到这三个参数里。

请问该怎么封装?

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


再补充一下关于封装的问题:我发觉对一个摘录环境封装并不是件很平凡的事,我对问题做了简化:

\documentclass{article}
\usepackage{tcolorbox,tikz}

\tcbuselibrary{listings, skins, breakable}

\begin{document}

\begin{tcblisting}{listing only, enhanced, frame code={%
      \node[anchor=north east] at (frame.north west){%
        \tcbox{
           % 这里填编译结果的代码
        }};
    },}
  % 这里填摘录的代码
\end{tcblisting}

\end{document}

以上两处代码实际上是一样的。

如果不用以上 tcblisting 环境套 tcbox 的方法实现,那么还有其他什么方法?谢谢。

查看更多

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

挑个软柿子:

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

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

撰写答案

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

发布
问题

分享
好友

手机
浏览

扫码手机浏览