在问题: 如何实现 pgfmanual(pgf-tikz 官方手册)中代码与结果共存的效果('side-by-side' code examples)中
提出要实现 pgfmanual 中摘录代码与编译效果同时出现的环境(codeexample),在pgfmanual-en-main-preamble.tex
中找到了这个环境,现在我想复刻并且改进这个环境的效果:
目前的进展:
我想到用 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}
可以看到,以上代码高亮也有问题,我希望(原环境)可以高亮命令,比如 \begin, \end, \draw
等,但现在只能高亮命令名,反斜杠不支持。如果使用 minted 库,一定程度上可以改进,但 minted 库需要调用 Pygments,编译速度很慢,我希望能规避。
此外,tkzexample 宏包提供的 tkzexample 环境一定程度上支持以上要求,但代码换行和换页不支持。
请问还有什么实现方法?谢谢。
谢谢解答,不过又有新的问题:如果这样设置
\draw
和draw
都高亮一样的颜色,而前者作为命令,后者是 node 的选项,似乎不太合适