我正在为我的学生组织创建一份代码/策略参考文档,以供将来的学生团体使用,并试图让那些以后要添加和更新它的人能够轻松阅读它。我一直以以下方式表示代码,这很好,但信息很长,我想让它更短一些。
\begin{minted}[mathescape, linenos, fontsize=\footnotesize]{python}
class MyClass:
def my_function():
# my code
\end{minted}
这将产生如图所示的显示
我知道那minted
是一个逐字环境,所以常规\newenvironment{codeblock}{...}{...}
命令实际上不起作用。当我尝试使用它时,它似乎可以正常工作,但无法\end{codeblock}
识别,导致整个文档的其余部分都处于代码样式。
我发现这个帖子,它展示了使用包中的命令的方法minted
,\newtcblisting
它tcolorbox
当然看起来更好,但也有几个问题。我定义了环境:
\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}
这看起来不错,我喜欢这个盒子,但我不知道如何解决两个问题:
- 行号与框的左边缘重叠。有没有办法将所有代码文本(包括行号)移到右侧?
- 原始代码在下半部分显示为文本(似乎在下划线后切换到数学模式),这在我上面引用和链接的帖子中没有发生过。我怎样才能阻止这种情况的显示,并且只在框中显示好看的代码?
任何帮助解决这些具体问题的方法,甚至只是定义一个与 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
,该选项将新选项附加到默认选项上。