L3 编程层(又名expl3
)具有l3msg
为各种消息、警告、错误等提供基础设施的包。但是,它具有一种特殊的消息换行样式,这使控制台、日志等中的消息清晰可见,但这对机器读取日志确实带来了一些挑战。
请考虑以下文档来说明该行为:
\documentclass{article}
\ExplSyntaxOn
\msg_new:nnn { long-package-name } { warning-message }
{
Warning~'#1'~for~label~'#2'~\msg_line_context:.~
Some~more~interesting~information~to~emphasize~the~wrapping.
}
\NewDocumentCommand \packagewarning { m m }
{ \msg_warning:nnnn { long-package-name } { warning-message } {#1} {#2} }
\ExplSyntaxOff
\begin{document}
Hello!
\packagewarning{x}{y}
\packagewarning{lorem}{ipsum}
\end{document}
这会在控制台中输出以下内容(摘录):
Package long-package-name Warning: Warning 'x' for label 'y' on line 17. Some
(long-package-name) more interesting information to emphasize
(long-package-name) the wrapping.
Package long-package-name Warning: Warning 'lorem' for label 'ipsum' on line
(long-package-name) 19. Some more interesting information to
(long-package-name) emphasize the wrapping.
因此,换行样式用 构建一个“标题” Package <module> Warning:
,它需要多列,而实际的消息被包装在剩余的列中,这些列可能是一个短数字(包名称越长,数字就越短)。
它确实使查看控制台输出的人能够清晰轻松地阅读。但许多编辑器使用不同的方法解析控制台输出以协助用户完成任务。例如,对于上述文档,AUCTeX 能够识别第一条消息的行并直接从错误概述中将我带到发出该消息的源点,但无法在第二条消息上做到这一点,因为它用于获取行号的正则表达式不再匹配on line (long-package-name) 19
。并且,这是否有效取决于包名称的长度以及消息本身中参数的长度。我推测其他编辑器也有类似的功能,并且可能在同一个地方失误。
我的问题是:如何处理这个问题?我是否应该以不同的方式编写消息,以便它对参数的任意内容不那么敏感?是否可以以某种方式将换行行为更改为例如以下内容?:
Package long-package-name Warning:
Warning 'x' for label 'y' on line 17. Some more interesting information to
emphasize the wrapping.
Package long-package-name Warning:
Warning 'lorem' for label 'ipsum' on line 19. Some more interesting
information to emphasize the wrapping.
如果是,我应该吗?我是不是应该不去管,让编辑们随着时间推移进行调整?有经验的人在这方面还有什么建议吗?
请注意,我不是问如何更改终端的换行列,而是问包应如何处理其消息,以便它适用于具有不同设置(特别是默认设置)的其他人。
编辑:关于编辑器的第二个数据点。我刚刚在 Overleaf 上测试了 MWE,它也没有得到第二条警告。
答案1
让我补充一个自我答案,以免这个问题没有答案。
首先,事实证明我的问题是基于一个错误的前提。这种格式并不是l3msg
/所特有的expl3
,而是长期以来 LaTeX 警告/错误消息的标准格式。l3msg
实际上,它采用了这种格式,以延续现有的格式。我错过了这一点,因为在尝试\PackageWarning
和\PackageError
时,没有看到第一行下面的连续性线,我推测格式是不同的。不同之处在于和\PackageWarning
不会\PackageError
自动换行消息文本,但它们与一些手动设置的 s 结合使用\MessageBreak
会给我们相同类型的消息。
但是,在实际操作上还是存在差异的,这对编辑器解析结果消息的能力有一定影响。差异在于l3msg
messages 会自动换行,而用于相同目的的标准 LaTeX 命令则需要手动换行。当然,这增加了l3msg
消息的便利性。但是,如果消息包含长度可能可变的参数,那么也更难预测换行的位置。在相同情况下,使用\PackageWarning
和\PackageError
,我们可能会得到一些过长的消息行,但换行点是确定的。因此,在编写消息时可能必须更加小心,以尽量避免在已知的关键位置换行。
但是,这将取决于给定编辑器解析这些消息的能力以及他们如何解析。例如,如果我们有兴趣确保编辑器能够识别消息源中的行号(OP中提出的问题),并且恰好知道编辑器使用以下形式的正则表达式"on line NN"
,我们可以将消息重写为:
\msg_new:nnn { long-package-name } { warning-message }
{
Warning~\msg_line_context:.~
Some~more~interesting~information~to~emphasize~the~wrapping~
about~'#1'~for~label~'#2'.
}
这种调整是否有效,或者是否有意义,取决于具体情况、编辑等。