在问题: 如何实现 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 的方法实现,那么还有其他什么方法?谢谢。
之前就说来回答的,拖了这么久 ...
代码如下:
\documentclass{article}
\usepackage[margin=2.5cm]{geometry}
\usepackage{tcolorbox}
\usepackage{minted}
\setminted{autogobble}
\usepackage{xsimverb}
\ExplSyntaxOn
\box_new:N \l__code_example_box
\NewDocumentEnvironment{codeexample}{!O{auxB.txt}}
{
\xsim_file_write_start:nn {\c_false_bool}{#1}
}{
\xsim_file_write_stop:
\hbox_set:Nn \l__code_example_box { \input{#1} }
\dim_compare:nNnTF { \the \box_wd:N \l__code_example_box } > { .33\linewidth }
{ \begin{tcolorbox}[left=10pt, right=10pt] }
{ \begin{tcolorbox}[sidebyside, left=10pt, right=10pt] }
\inputminted{latex}{#1}
\tcblower
\box_use_drop:N \l__code_example_box
\end{tcolorbox}
}
\ExplSyntaxOff
\begin{document}
\begin{codeexample}[code-example.tex]
\begin{tikzpicture}
\draw[draw, dashed] (0, 0) rectangle (3, 3);
\draw[blue, ->] (0, 0) -- (2, 2);
\end{tikzpicture}
\end{codeexample}
\begin{codeexample}
\begin{tikzpicture}
\draw[draw, dashed] (0, 0) rectangle (7, 7);
\draw[red, ->] (0, 0) -- (6, 6);
\end{tikzpicture}
\end{codeexample}
\end{document}
运行结果如下:
功能简述:
1/3\linewidth
时,采用上下排版;反之,采用左右排版.你可以在这个基础上自己改进一下.
挑个软柿子:
可以看到,以上代码高亮也有问题,我希望(原环境)可以高亮命令,比如\begin
,\end
,\draw
等,但现在只能高亮命令名,反斜杠不支持。如果使用minted
库,一定程度上可以改进,但minted
库需要调用Pygments
,编译速度很慢,我希望能规避
这个问题应该与tcolorbox
和example
无关,可以参考这个链接.
谢谢 E 老师,我学习一下
@u26254 这个可选参数你完全可以改为其它的,比如改为一个
s
参数(把原始命令改为\NewDocumentEnvironment{codeexample}{s}
, 此时需要你指定文件名), 这样你不仅可以自动控制它的排版样式,还可以手动控制;@u73286 谢谢 E 老师,可能之后还有问题请教,不过我先采纳