将十六进制字符串转换为 (La)TeX 数字

将十六进制字符串转换为 (La)TeX 数字

如何将用户提供的十六进制字符串(例如14b或 )转换14B为 (La)TeX 可以识别为数字的内容?我猜想像 xcolor 这样的包可以做到这一点,但我无法找到如何做到这一点(谷歌在这里没有帮助)。我知道"XX但它最多只能达到 FF,或者 XeTeX 中的 FFFF,这对我来说在所有情况下都不够。在输入过程中转换为十进制并不是一个真正的选择。请注意,这不是关于以不同形式排版数字,而是关于将表示十六进制数字的字符串参数转换为可用于计算的内容。

答案1

函数\int_from_hex:n接受从到 的expl3数字的大写和小写字母。因此,您可以执行AF

\usepackage{expl3}

\ExplSyntaxOn
\cs_set_eq:NN \intfromhex \int_from_hex:n
\ExplSyntaxOff

and\Uchar\intfromhex{14b}\Uchar\intfromhex{14B}将产生相同的结果。

实际上expl3有自己的版本\Uchar,但这是另一个话题。

如果你需要做算术,还可以添加

\cs_set_eq:NN \inteval \int_eval:n

之前\ExplSyntaxOff和类似

\Uchar\inteval{36+\intfromhex{14b}}

可以工作(这里 36 是十进制)。

请注意,这36+"14b不起作用,因为"符号中只允许大写字母。使用\intfromhex转换为十进制。

答案2

\usepackage{xintbinhex},然后\xintDecToHex{\the\numexpr "ABCDE + "EBCDA\relax}以十六进制表示法扩展结果,但不带前导"。但在 TeX 需要数字的任何情况下,您都可以使用

"\xintDecToHex{\the\numexpr "ABCDE + "EBCDA\relax}

语法,并 "预先手动添加。

如果结果\numexpr超出 TeX 界限(十六进制为"7FFFFFFF),您可以加载包xintexpr。 然后

\xintDecToHex{\thexintiiexpr "7FFFFFFF + "1\relax}

将按预期工作并产生结果80000000。同样没有前导"

\documentclass{scrartcl}

\usepackage{xintbinhex}
\usepackage{xintexpr}
\begin{document}

\xintDecToHex{\the\numexpr "ABCDE + "EBCDA\relax}

\xintDecToHex{\the\numexpr "111111 + "ABCDEF\relax}

\count255 = "\xintDecToHex{\the\numexpr "ABCDE + "EBCDA\relax}

\the\count255

\xintDecToHex{\thexintiiexpr "7FFFFFFF + "1\relax}

\end{document}

在此处输入图片描述

如果您的查询是将十六进制转换为十进制,那么还有\xintHexToDec(还有什么?)

\xintHexToDec{AAAAABBBBBCCCCCDDDDDEEEEEFFFFF99999}

请注意,在此宏用法中,没有"前缀。或者,等效地

\thexintiiexpr "AAAAABBBBBCCCCCDDDDDEEEEEFFFFF99999\relax

两者都给出:

在此处输入图片描述

两者都只需要大写字母,就像 TeX 一样,但没有大小限制。

相关内容