![自动换行功能](https://linux22.com/image/383489/%E8%87%AA%E5%8A%A8%E6%8D%A2%E8%A1%8C%E5%8A%9F%E8%83%BD.png)
我正在使用minted
包来生成语法高亮的代码片段。但是,我想展示的清单中有一些行溢出了。Minted 可以使用选项自动处理换行符breakline
。但我希望换行符出现在与实际行相同的缩进级别上。
我以为这个breakautoindent
选项会完全满足我的要求,但它不会缩进换行符,无论行的缩进是多少。以下代码
\begin{minted}[linenos, breaklines, breakautoindent=true]{AMPL}
param n; # Number of nodes in network
set NODES := 1..n;
set LINKS within (NODES cross NODES);
param Capacities {LINKS} >= 0; # Maximum capacity for each edge
var Flow {(i, j) in LINKS} >= 0, <= Capacities[i,j];
# Restrain the domain of the variables to [0, capacity]
maximize MaxFlow: # Objective function (flow recieved by end node)
sum {(i, n) in LINKS} Flow[i, n];
subject to Conservation: # Ensure no flow is lost from start to end
sum {(1, j) in LINKS} Flow[1, j] = sum {(i, n) in LINKS} Flow[i, n];
subject to Balance {k in (NODES diff {1, n})}: # Transit nodes
sum {(k, j) in LINKS} Flow[k,j] == sum {(i, k) in LINKS} Flow[i, k];
\end{minted}
生产
请注意,换行符都具有相同的缩进级别(即无),但有些行的缩进级别要高得多(例如注释# Restrain [...]
)。
问题的根源是什么?
编辑:我也试过了obeytabs
。
答案1
2022/12/01 更新
breakautoindent
实际上是在 内处理的minted
。fvextra
的最新版本fvextra
(2022/11/30 的 v1.5)会自动检查每行上的第一个 Pygments 标记是否存在前导空格,因此breakautoindent
现在应该在基本上所有情况下都给出预期的输出,无论 Pygments 词法分析器如何处理空格。
这Pygments AMPL 词法分析器将空白视为PygmentsText.Whitespace
代币,用于“特别突出显示的空白”。因此,缩进不会显示为普通缩进字符(这是 使用的缩进字符minted
)breaklines
,而是显示为包含在 Pygments 标记宏中的字符(在本例中为\PYG{+w}{<whitespace_chars>}
)。
最简单的解决方案是编辑以ampl.py
替换。从技术上讲,可以在每行的第一个标记的开头查找空格,但正确实现这一点(特别是如果需要考虑标记类型)可能会很复杂。(r'\s+', Text.Whitespace)
(r'\s+', Text)
minted