有没有办法使用 ANSI 颜色将内容输出到控制台?

有没有办法使用 ANSI 颜色将内容输出到控制台?

我正在尝试将诊断输出着色到控制台,以便使我的内容在 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 characters。

问题

有什么技巧可以实现这个效果吗?

答案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

以下示例文件定义\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转义字符。现在我想知道是否存在不包含外部脚本的解决方案。

相关内容