灵感来自昨天的一个问题,我想尝试一下 LaTeX3 解决方案,它将展示如何将十进制数字转换为用户选择的任何其他进制。
昨天我写了一个不错的简单版本,效果很好。但今天,我决定将步骤的构建与输出和格式化这些步骤的过程分开。我还认为探索创建以下效果的可能性会很有趣:数组中的数组使用sequences
和token lists
。
但现在,我遇到了一个错误。
\documentclass{article}
\usepackage{amsmath,amssymb}
\usepackage{xparse}
\pagestyle{empty}
\ExplSyntaxOn
%% setting and getting the base
\int_new:N \g__new_base_int
\NewDocumentCommand{\setbase}{ m }{
\int_gset:Nn \g__new_base_int { #1 }
}
\NewDocumentCommand{\getbase}{}{
\int_use:N \g__new_base_int
}
%% setting and getting the number to be converted
\int_new:N \g__number_to_convert_int
\NewDocumentCommand{\setnumber}{ m }{
\int_gset:Nn \g__number_to_convert_int {#1}
}
\NewDocumentCommand{\getnumber}{ }{
\int_use:N \g__number_to_convert_int
}
%%---internal function to build each step in the conversion process
%%---and the parameters to be used for this function
\int_new:N \l__quotient_int
\int_new:N \l__tmp_new_quotient_int
\int_new:N \l__remainder_int
\seq_new:N \g__steps_of_conversion
\cs_new:Nn \__build_steps_of_conversion: {
\int_set_eq:NN \l__quotient_int \g__number_to_convert_int
\int_do_while:nn { \l__quotient_int >= \g__new_base_int }
{
\int_set:Nn \l__remainder_int { \int_mod:nn { \l__quotient_int } { \g__new_base_int } }
\int_set:Nn \l__tmp_new_quotient_int { \int_div_truncate:nn { \l__quotient_int } {\g__new_base_int }}
\exp_args:NNx \seq_gput_right:Nn \g__steps_of_conversion
{
{\int_use:N \g__new_base_int }
{\int_use:N \l__quotient_int }
{\int_use:N \l__remainder_int }
{\int_use:N \l__tmp_new_quotient_int}
}
\int_set_eq:NN \l__quotient_int \l__tmp_new_quotient_int
}
}
%%---internal function to construct the display of the conversion process
\bool_new:N \l__first_item_on_line_bool
\cs_new:Nn \__show_steps_of_conversion: {
\__build_steps_of_conversion:
\seq_map_inline:Nn \g__steps_of_conversion
{
\bool_set_true:N \l__first_item_on_line_bool
\tl_map_inline:nn { ##1 } {
\bool_if:NF \l__first_item_on_line_bool { & }
###1
\bool_set_false:N \l__first_item_on_line_bool
}
\\
}
}
%%---user interface to displaying the conversion
\NewDocumentCommand{\showstepsofconversion}{ o }{
\[
\begin{array}{crc|r}
\text{Base} & & \text{R} & \text{Q} \\\hline
\__show_steps_of_conversion:
\end{array}
\]
}
%% accessing and using LaTeX3's internal base conversion
\NewDocumentCommand{\converttobase}{m}{
\int_to_base:nn {#1} \g__new_base_int
}
%%
\ExplSyntaxOff
\setlength{\parindent}{0pt}
\setbase{21}
\setnumber{2680010}
\begin{document}
The base is \getbase. \getnumber{} becomes $\converttobase{\getnumber}_{\getbase}$.
\showstepsofconversion
\end{document}
问题似乎是###1
。奇怪的是,输出结果正是我想要的。建议的更正为##1
显然不正确,当我将代码重写为 时,##1
我得到了错误的值。
答案1
您希望在宏定义中#
引用4。 #1
(这是原始的 TeX 解析,而不是 LaTeX3 功能)
####1
不是
###1