在问题: 如何实现 pgfmanual(pgf-tikz 官方手册)中代码与结果共存的效果('side-by-side' code examples)中
提出要实现 pgfmanual 中摘录代码与编译效果同时出现的环境(codeexample),在pgfmanual-en-main-preamble.tex
中找到了这个环境,现在我想复刻并且改进这个环境的效果。
目前的进展:
用 tcolorbox 实现,先实现左边图片(编译结果),右边摘录代码的情况:
(为了简化问题,此处省掉代码,下面有构造思路与主要问题)
思路:输出一个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 的方法实现,那么还有其他什么方法?谢谢。
谢谢解答,不过又有新的问题:如果这样设置
\draw
和draw
都高亮一样的颜色,而前者作为命令,后者是 node 的选项,似乎不太合适@u26254 有道理,补充一个以
minted
为benchmark的效果对照:@u70550 嗯,minted 确实高亮不错,但编译速度比较慢而且对断行似乎不太友好(在 tcb 中)