我正在尝试将诊断输出着色到控制台,以便使我的内容在 LaTeX 吐出的无尽消息流中更加清晰可见。
例子
然而,我所有的努力,例如
\typeout{^^1b[38;05;54m Indigo!} % Text line contains an invalid character.
\typeout{\char"001B[38;05;54m Indigo!} % \char "001B[38;05;54m Indigo!
似乎被 TeX 颠覆了,要么不扩展其中的某些命令\typeout
,要么声称有illegal character
s。
问题
有什么技巧可以实现这个效果吗?
答案1
有两个问题:
LaTeX 为字符分配了 catcode 15
^^1b
(十进制 27)。使用^^1b
触发器时出现错误消息:! Text line contains an invalid character.
因此需要改变角色的 catcode(见下面的示例)。
TeX 通常使用 -notation 打印控制字符
^^
。TeX 编译器可以使用命令行选项来更改此行为:- TeX Live:
-8bit
或-translate-file=natural
- MikTeX:
--tcx=natural
- TeX Live:
以下示例文件定义\CSI
为 的快捷方式^^1b[
。
\documentclass{article}
\begingroup
\makeatletter
\@makeother\^^1b
\@firstofone{\endgroup
\newcommand*{\CSI}{^^1b[}%
}
\typeout{}
\typeout{\CSI38;05;54mIndigo! \CSI1mBold\CSI22m \CSI4mUnderlined\CSI0m}
\typeout{\CSI37m\CSI41m\CSI1mBold white on red\CSI0m}
\typeout{}
\begin{document}
\end{document}
答案2
我发现的一种方法是使用\write18
。我创建了一个 bash 脚本:
#!/usr/bin/env bash
echo -e "\x1b$*\x1b[0m"
然后在我的 TeX 中我做
\immediate\write18{esc "[38;05;54mhelo Indigo"}
换句话说,我“外包”了打印有问题的\x1b
转义字符。现在我想知道是否存在不包含外部脚本的解决方案。