ConTeXt:vimtype 和精细设置

ConTeXt:vimtype 和精细设置

我正在尝试在 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,
]

第一个是,顺便说一下,更多语境...

相关内容