在 tcblisting 中格式化铸造代码框

在 tcblisting 中格式化铸造代码框

我正在为我的学生组织创建一份代码/策略参考文档,以供将来的学生团体使用,并试图让那些以后要添加和更新它的人能够轻松阅读它。我一直以以下方式表示代码,这很好,但信息很长,我想让它更短一些。

\begin{minted}[mathescape, linenos, fontsize=\footnotesize]{python}
class MyClass:
    def my_function():
        # my code
\end{minted}

这将产生如图所示的显示

第一个代码块产生的结果

我知道那minted是一个逐字环境,所以常规\newenvironment{codeblock}{...}{...}命令实际上不起作用。当我尝试使用它时,它似乎可以正常工作,但无法\end{codeblock}识别,导致整个文档的其余部分都处于代码样式。

我发现这个帖子,它展示了使用包中的命令的方法minted\newtcblistingtcolorbox当然看起来更好,但也有几个问题。我定义了环境:

\usepackage{minted} \usepackage{tcolorbox} \tcbuselibrary{minted}
\newtcblisting{codeblock}[2][]{
  minted options={mathescape, linenos,fontsize=\footnotesize},  
  minted language=#2,
  #1
}

然后我用它,

\begin{codeblock}{python}
class MyClass:
    def my_function():
        # my code
\end{codeblock}

第二个代码块生成的内容

这看起来不错,我喜欢这个盒子,但我不知道如何解决两个问题:

  1. 行号与框的左边缘重叠。有没有办法将所有代码文本(包括行号)移到右侧?
  2. 原始代码在下半部分显示为文本(似乎在下划线后切换到数学模式),这在我上面引用和链接的帖子中没有发生过。我怎样才能阻止这种情况的显示,并且只在框中显示好看的代码?

任何帮助解决这些具体问题的方法,甚至只是定义一个与 minted 兼容的自定义环境的方法,都将不胜感激。我在这里找到了一些帖子,但都不起作用。

答案1

一些说明:

  • 处理行号重叠:要么使用minted选项numbersep=<dimension>减少原始代码和行号之间的间隔,要么使用tcolorbox选项left=<dimension>放大彩色框的左内边距。在下面的例子中,numbersep=5pt使用了。
  • 仅显示原始代码:tcolorbox选项listing only
\documentclass{article}
\usepackage{tcolorbox}
\tcbuselibrary{hooks, minted}

\newtcblisting{codeblock}[2][]{
  minted options app={mathescape, linenos, fontsize=\footnotesize, numbersep=5pt},  
  minted language=#2,
  #1,
  listing only
}

\begin{document}
\begin{codeblock}{python}
class MyClass:
    def my_function():
        # my code
\end{codeblock}
\end{document}

在此处输入图片描述

PS:minted options选项有默认值tabsize=2,fontsize=\small, breaklines,autogobble。使用时minted options={...},默认值将被覆盖。因此将使用库minted options app={...}中的另一个选项hooks,该选项将新选项附加到默认选项上。

相关内容