值矩阵作为宏的参数

值矩阵作为宏的参数

这是我的代码:

\documentclass{article}

\usepackage{polyglossia}
\usepackage{forloop}

\newcommand{\values}[2]{
    \ifcase#1%
        \ifcase#2%
            value a%
        \c%
            value b%
        \or%
            value c%
        \fi
    \or%
        \ifcase#2%
            value d%
        \or%
            value e%
        \or%
            value f%
        \fi
    \fi%
}

\newcounter{ct}
\newcommand{\mytable}[1]{
    \begin{tabular}{l|l|l}
        First & Second & Third
        \forloop{ct}{0}{\value{ct} < #1}{
            \\ \hline
            \values{\thect}{0} & \values{\thect}{1} & \values{\thect}{2}
        }
    \end{tabular}
}

\begin{document}
    \mytable{2}
    \mytable{3}
\end{document}

我想要做的是定义一个宏\mytable,它将行数作为第一个参数,然后将第二个参数作为表的内容。我当前的方法使用第二个宏来提供内容。我正在寻找一种方法将当前定义的值传递给\values\mytable以便第二次调用可以具有不同的内容。\renewcommand{\values}在实际代码中,调用之间不是一种选择。

答案1

目前还不清楚在设置值时需要什么样的灵活性,但有一种可能性可能足够,也可能不够。

\documentclass{article}

%\usepackage{polyglossia}
\usepackage{forloop}

\newcommand{\valuesA}[2]{
    \ifcase#1%
        \ifcase#2%
            value a%
        \or%
            value b%
        \or%
            value c%
        \fi
    \or%
        \ifcase#2%
            value d%
        \or%
            value e%
        \or%
            value f%
        \fi
    \fi%
}

\newcommand{\valuesB}[2]{
    \ifcase#1%
        \ifcase#2%
            value A%
        \or%
            value B%
        \or%
            value C%
        \fi
    \or%
        \ifcase#2%
            value X%
        \or%
            value Y%
        \or%
            value Z%
        \fi
    \fi%
}

\newcounter{ct}
\newcommand{\mytable}[2]{
    \begin{tabular}{l|l|l}
        First & Second & Third
        \forloop{ct}{0}{\value{ct} < #1}{
            \\ \hline
            #2{\thect}{0} & #2{\thect}{1} & #2{\thect}{2}
        }
    \end{tabular}
}

\begin{document}
    \mytable{2}{\valuesA}

\bigskip
    \mytable{3}{\valuesB}
\end{document}

在此处输入图片描述

答案2

有了xparse和,expl3您可以拥有一个更好的界面来定义矩阵。

\documentclass{article}
\usepackage{xparse}

\ExplSyntaxOn
\NewDocumentCommand{\definematrix}{O{default}m}
 {
  \flyx_define_matrix:nn { #1 } { #2 }
 }

\NewDocumentCommand{\usematrix}{O{default}m}
 {
  \flyx_use_matrix:nn { #1 } { #2 }
 }

\NewDocumentCommand{\setmatrixformat}{mm}
 {
  \tl_gset:Nn \g_flyx_matrix_format_tl { #1 }
  \tl_gset:Nn \g_flyx_matrix_header_tl { #2 }
 }

\seq_new:N \l_flyx_temp_rows_seq
\int_new:N \l_flyx_row_index_int
\tl_new:N \g_flyx_matrix_format_tl
\tl_new:N \g_flyx_matrix_header_tl

\cs_new_protected:Npn \flyx_define_matrix:nn #1 #2
 {
  \seq_set_split:Nnn \l_flyx_temp_rows_seq { \\ } { #2 }
  \int_zero:N \l_flyx_row_index_int
  \seq_map_inline:Nn \l_flyx_temp_rows_seq
   {
    \int_incr:N \l_flyx_row_index_int
    \tl_gclear_new:c { g_flyx_#1_matrix_ \int_to_roman:n { \l_flyx_row_index_int } _tl }
    \tl_gset:cn
     { g_flyx_#1_matrix_ \int_to_roman:n { \l_flyx_row_index_int } _tl }
     { ##1 }
   }
 }

\cs_new_protected:Npn \flyx_use_matrix:nn #1 #2
 {
  \use:x { \exp_not:N \begin{tabular} { \exp_not:V \g_flyx_matrix_format_tl } }
  \hline
  \tl_use:N \g_flyx_matrix_header_tl \\
  \hline
  \tl_clear:N \l_flyx_table_body_tl
  \int_step_inline:nnnn { 1 } { 1 } { #2 }
   {
    \tl_put_right:Nv \l_flyx_table_body_tl { g_flyx_#1_matrix_ \int_to_roman:n { ##1 } _tl }
    \tl_put_right:Nn \l_flyx_table_body_tl { \\ }
   }
  \tl_use:N \l_flyx_table_body_tl
  \hline
  \end{tabular}
 }

\cs_generate_variant:Nn \tl_put_right:Nn { Nv }
\ExplSyntaxOff


\definematrix{
  a & b & c \\
  d & e & f \\
  g & h & i
}

\definematrix[numbers]{
  1 & 2 \\
  3 & 4 \\
  5 & 6 \\
  7 & 8
}

\setmatrixformat{|l|l|l|}{First & Second & Third}

\begin{document}

\usematrix{2} \quad \usematrix{3}

\medskip

\setmatrixformat{lll}{A & B & C}

\usematrix{2}

\medskip

\setmatrixformat{cc}{A & B}

\usematrix[numbers]{3} \qquad \usematrix[numbers]{4}

\end{document}

\definematrix一个可选参数(名称);具有相同名称(或没有名称)的连续声明将覆盖定义的矩阵。

您可以\setmatrixformat设置从那时起要使用的列和标题。

\usematrix可以指定名称(或使用默认矩阵)和要使用的行数。

在此处输入图片描述

相关内容