这是我的代码:
\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
可以指定名称(或使用默认矩阵)和要使用的行数。