我正在尝试在 Python 代码周围绘制 MP 背景;我想在对之前/之后自动调用一些宏\startpython/\stoppython
,因此我定义了另一个环境来设置/清理。我已经在其他设置中成功使用了它(不是使用 vimtyping 环境,而是使用 Lists 或 TikZ...),但在这里我收到此错误:
“tex 错误 > 文件 /opt/context/tex/texmf-context/tex/context/base/mkiv/cont-yes.mkiv 中第 1 行出现 tex 错误:!TeX 容量超出,抱歉 [输入堆栈大小=10000]”
我在下面的 MWE 中重现了这种行为;是不是我在手册中没有看到什么?
\usemodule[vim]
\definevimtyping[python][
syntax=python
]
%% these are temps, the aim is to add MP background around
\def\startPythonCode{
\startpython
}
\def\stopPythonCode{
\stoppython
}
\starttext
\startpython %% This works, no pb
print("Hello World")
\stoppython
\startPythonCode
print("Hello World") %% pb here : TeX capacity exceeded
\stopPythonCode
\stoptext
先感谢您,
======= 编辑 ======
正如评论中所要求的那样,我添加了我打算使用的 MP 背景:
\startuseMPgraphic{mp:codeFrame}
numeric u,o ; u := 1EmWidth ; o := BodyFontSize;
for i=1 upto nofmultipars :
pair bl, br, ul, ur;
bl := llcorner multipars[i]; br := lrcorner multipars[i];
ul := ulcorner multipars[i]; ur := urcorner multipars[i];
path p;
p := ( bl -- br -- ur -- ul -- cycle ) enlarged (0,0.5u) shifted (0,0);
draw p withpen pencircle scaled 1bp withcolor 0.5 white;
endfor;
\stopuseMPgraphic
\definetextbackground[codeFrameBackground][
mp=mp:codeFrame,
location=always,
leftoffset=1em,rightoffset=1em,
topoffset=0ex,bottomoffset=0ex,
before={},
after={},
level=-2,
]
先感谢您,
====== 编辑 2 =======
正如 DG 的回答中所建议的那样,该before/after
对似乎不适用于我的真实环境。这是一个新的 MWE,更接近我的真实环境,它重现了“Missing } inserted”错误。
在 /home/adrien/Enseignement-physique/tex/context/ConTeXt_adrienLicari_code.tex 文件中:
\usemodule[vim]
%% Backgrounds
\startuseMPgraphic{mp:codeFrame}
numeric u,o ; u := 1EmWidth ; o := BodyFontSize;
for i=1 upto nofmultipars :
pair bl, br, ul, ur;
bl := llcorner multipars[i]; br := lrcorner multipars[i];
ul := ulcorner multipars[i]; ur := urcorner multipars[i];
path p;
p := ( bl -- br -- ur -- ul -- cycle ) enlarged (0,0.5u) shifted (0,0);
draw p withpen pencircle scaled 1bp withcolor 0.5 white;
endfor;
\stopuseMPgraphic
\definetextbackground[codeFrameBackground][
mp=mp:codeFrame,
location=always,
leftoffset=1em,rightoffset=1em,
topoffset=0ex,bottomoffset=0ex,
before={},
after={},
level=-2
]
%% Python
\definevimtyping[python][
syntax=python,
strip=yes,
tab=4,
margin=1em,
left={}, right={},
numbering=yes,
directory=../tmp-vimout/,
before={\startcodeFrameBackground},
after={\stopcodeFrameBackground}
]
在 mwe.tex 文件中:
%% Environnement personnalisé
\usepath[{/home/adrien/Enseignement-physique/tex/context}]
\environment ConTeXt_adrienLicari_code
\starttext
\startpython
print('Hello, world!') # Fonction d'affichage
\stoppython
\stoptext
先感谢您,
答案1
您可以使用before=
和after=
选项:
\usemodule[vim]
\startuseMPgraphic{mp:codeFrame}
numeric u,o ; u := 1EmWidth ; o := BodyFontSize;
for i=1 upto nofmultipars :
pair bl, br, ul, ur;
bl := llcorner multipars[i]; br := lrcorner multipars[i];
ul := ulcorner multipars[i]; ur := urcorner multipars[i];
path p;
p := ( bl -- br -- ur -- ul -- cycle ) enlarged (0,0.5u) shifted (0,0);
draw p withpen pencircle scaled 1bp withcolor 0.5 white;
endfor;
\stopuseMPgraphic
\definetextbackground
[codeFrameBackground]
[mp=mp:codeFrame,
location=paragraph,
leftoffset=1em,rightoffset=1em,
topoffset=0ex,bottomoffset=0ex,
before={},
after={},
level=-2]
\definevimtyping
[python]
[syntax=python,
before={\startcodeFrameBackground},
after={\stopcodeFrameBackground}]
\starttext
\startpython %% This works, no pb
print("Hello World")
\stoppython
\stoptext
更新后的 MWE 中的罪魁祸首是 之后的空格after={\stopcodeFrameBackground}
。为了避免此问题,您应该编写设置,或者在最后一行结尾处加上右括号,如下所示:
\setupsomething
[whatever]
[key-1=value-1,
key-2=value-2]
或者用逗号,例如:
\setupsomething[whatever][
key-1=value-1,
key-2=value-2,
]
第一个是,顺便说一下,更多语境...