当我编写自己的私有风格包时(例如在开发它们时),我发现它很有用,可以\typeout
帮助我查看我当前创建的内容,或者找出哪行代码是问题的根源(特别是当抛出神秘的错误消息时)。
目前,我正在重构一些expl3
我以前编写的旧代码,当时我对 了解甚少expl3
。在整个代码中,我加入了\typeout
和之类的东西\space
,使终端输出简单易读。我实际上喜欢这个终端输出,因为它可以帮助我调试东西,但我找不到 的任何expl3
等价物\typeout
。我能找到的最好的\msg_warning:...
东西是 向终端抛出太多东西。
同样,我喜欢\space
通过连接在终端屏幕上创建更大的空白空间。连接~
不起作用。
在调试和输出到终端时我真正欣赏的第三个宏是\detokenize
。
看来,在编写时expl3
,我应该坚持使用expl3
宏等。有人对编写expl3
以下等效项有什么建议吗:
\typeout{....}
\detokenize{....}
\space
答案1
您希望\iow_term:n
以通常的方式扩展宏。
\RequirePackage{expl3}
\ExplSyntaxOn
\iow_term:n {Hi,~Andrew,~how~are~you?~This~message~will~automatically~
wrap~when~reaching~a~predefined\c_space_tl limit. \\ \\
You~can~force~a~break~and~use~\exp_not:N \tl_to_str:n
for~showing~\tl_to_str:n{\whatever~you~\want}}
这将输出
*************************************************
* Hi, Andrew, how are you? This message will automatically wrap when
* reaching a predefined limit.
*
* You can force a break and use \tl_to_str:n for showing \whatever you \want
*************************************************
\iow_term:n
的类似物也是如此\typeout
,而\tl_to_str:n
是\detokenize
;空间是\c_space_tl
,即确切地和 一样\space
。
还有\iow_log:n
仅用于写入日志文件的功能。
答案2
grep
是你的朋友:
l3kernel/l3tl.dtx:\cs_new_eq:NN \tl_to_str:n \etex_detokenize:D
l3kernel/l3tl.dtx:\tl_const:Nn \c_space_tl { ~ }
如果您不喜欢消息\msg
功能,它可能\typeout
仍然是您的朋友。
答案3
第一个答案不再准确,没有更多的星星,扩展策略也发生了变化。必须适应使用 或\iow_term:n
,\iow_term:x
前者不扩展任何内容,而后者扩展...可扩展的内容。
下面是一个具有各种设置的示例,用于说明如何扩展某些宏或不扩展。
\documentclass{minimal}
\ExplSyntaxOn
\tl_set:Nn \l_tmpa_tl { 2 + 2 }
\int_set:Nn \l_tmpa_int { \l_tmpa_tl }
\iow_term:n{****~\iow_term:n :~\l_tmpa_tl~=~\l_tmpa_int}
\iow_term:x{****~\iow_term:x :~\l_tmpa_tl~\c_space_tl=~\l_tmpa_int}
\iow_term:x{****~\iow_term:x :~\l_tmpa_tl~\c_space_tl=~\int_use:N\l_tmpa_int}
\iow_term:x{****~\iow_term:x :~\exp_not:N \l_tmpa_tl~=~\int_use:N\l_tmpa_int}
\ExplSyntaxOff
\begin{document}
\end{document}
终端输出内容为
**** \iow_term:n : \l_tmpa_tl = \l_tmpa_int
**** \iow_term:x : 2+2 = \l_tmpa_int
**** \iow_term:x : 2+2 = 4
**** \iow_term:x : \l_tmpa_tl = 4
有时\c_space_tl
需要在 之前插入一个空格=
。