是否可以在 LateX 中创建一个表,用整个文本中方程式中使用的一些参数的值来填充?
需要明确的是,像命名法这样的东西,您可以在命名法部分定义符号并将其打印出来,但这次是一个带有值的表(例如\command{x}{5}{mm}
,它将创建一行 | x | 5 | mm |)
为了使我更加清楚,请看以下示例:
假设我们有以下等式:
ax + b = 0
并且我希望在表中定义值 a 和 b。如果可能的话,我希望有这样的内容:
\command{a}{100}{mm}
\command{b}{10}{mm}
这将索引一个如下所示的表:
|Parameter | Value | Unit |
---------------------------
|a | 100 | mm |
|b | 10 | mm |
然后可以根据与每个条目关联的某些键在文本中引用该表中的条目,即\printval{a}
打印“100”,\printunit{b}
打印“mm”。
答案1
替代答案使用expl3
此示例expl3
使用\newparam[$]{alpha}{\alpha}{1.3}{kg}
定义一个用键“alpha”保存的参数,该参数\alpha
以值1.3
和单位的形式打印kg
。打印列表中参数周围的 可选[$]
位置。 ,并打印与“key”关联的参数、值和单位。键必须仅由字母组成,但打印的参数可以包含数学元素,如或。$
\param{key}
\paramval{key}
\paramunits{key}
\alpha
x_i
参数列表由 打印,这将检查参数是否已被调用,并且只有、或\printparams
之一调用的参数。在此代码中应包含在某个环境中,因为它仅打印定义为 的参数。\param
\paramval
\paramunits
\printparams
tabular
$\alpha$ & 1.3 & kg \\
\newparam[$]{alpha}{\alpha}{1.3}{kg}
\documentclass{article}
\usepackage{xparse}
\ExplSyntaxOn
\seq_new:N \l_param_used_seq
\seq_new:N \l_param_printlist_seq
\NewDocumentCommand{\newparam}{O{}mmmm}
{
\cs_new:cn {param_enclose_#2:}{#1}
\cs_new:cn {param_param_#2:}{#3}
\cs_new:cn {param_value_#2:}{#4}
\cs_new:cn {param_units_#2:}{#5}
\bool_new:c {l_param_#2_used_bool}
}
\cs_new:Nn \param_lookup:nn {
\use:c {param_#1_#2:}
\bool_if:cF {l_param_#2_used_bool}
{
\seq_put_right:Nn \l_param_used_seq { #2 }
}
\bool_set_true:c {l_param_#2_used_bool}
}
\NewDocumentCommand \printparams { }
{
\seq_map_inline:Nn \l_param_used_seq
{
\seq_put_right:Nn \l_param_printlist_seq
{
\use:c {param_enclose_##1:} \param_lookup:nn{param}{##1} \use:c {param_enclose_##1:} & \param_lookup:nn{value}{##1} & \param_lookup:nn{units}{##1} \\
}
}
\seq_use:Nn \l_param_printlist_seq { }
}
\NewDocumentCommand{\param}{m}{ \param_lookup:nn{param}{#1} }
\NewDocumentCommand{\paramval}{m}{ \param_lookup:nn{value}{#1} }
\NewDocumentCommand{\paramunits}{m}{ \param_lookup:nn{units}{#1} }
\ExplSyntaxOff
\newparam[$]{x}{x_ i}{10}{mm}
\newparam{length}{L}{13.2}{km}
\newparam[$]{alpha}{$\alpha$}{1.3}{kg}
\begin{document}
Parameter: $\param{x}$
Value: \paramval{x}
Units: \paramunits{x}
\begin{equation}
\param{length}=1320000\param{x}
\end{equation}
The length \param{length} is \paramval{length}\paramunits{length}
Here are the parameters:
\begin{center}
\begin{tabular}{ c c c }
Parameter & Value & Units \\ \hline
\printparams \hline
\end{tabular}
\end{center}
\end{document}
这产生了
使用 datatool 的原始答案
\alpha
这对于保存数学运算(例如或)有限制,x_i
但对于简单的字符串,这应该是有用的。
据我了解,数据工具包可以满足您的需要,但这绝不是一种完善或智能的方法 - 如果您查看词汇表或数据工具包(或类似的)包文档,您可能会找到更好的方法来做到这一点。
下面的示例定义了一个表,其中的列包含键、参数、值和单位。使用\newparam{length}{L}{13.2}{km}
参数、值和单位分别添加条目,其中键为“长度”的参数为\param{length}
、\paramval{length}
和\paramunits{length}
。
\printparamtable
打印所有已保存参数的表格。不检查由 定义的参数是否\newparam
在文本中实际使用 -\newparam
打印所有以 结尾的参数。
序言定义了上述宏,这些宏很可能是您想要在底层数据工具宏方面使用的形式。
\documentclass{article}
\usepackage{datatool}
\usepackage{longtable}
\newcommand{\paramtable}{ParameterLookUp}
\DTLnewdb{\paramtable}
\newcommand{\paramaddcolumn}[2]{
\DTLaddcolumn{\paramtable}{#1}
\DTLsetheader{\paramtable}{#1}{#2}
}
\paramaddcolumn{paramkey}{Parameter Key}
\paramaddcolumn{param}{Parameter}
\paramaddcolumn{value}{Value}
\paramaddcolumn{units}{Units}
\newcommand{\newparam}[4]{
\DTLnewrow{\paramtable}
\DTLnewdbentry{\paramtable}{paramkey}{#1}
\DTLnewdbentry{\paramtable}{param}{#2}
\DTLnewdbentry{\paramtable}{value}{#3}
\DTLnewdbentry{\paramtable}{units}{#4}
}
\newcommand{\param}[1]{\DTLfetch{\paramtable}{paramkey}{#1}{param}}
\newcommand{\paramval}[1]{\DTLfetch{\paramtable}{paramkey}{#1}{value}}
\newcommand{\paramunits}[1]{\DTLfetch{\paramtable}{paramkey}{#1}{units}}
\newcommand{\printparamtable}{\DTLdisplaylongdb[omit=paramkey]{\paramtable}}
\newparam{x}{x}{10}{mm}
\newparam{length}{L}{13.2}{km}
\begin{document}
Parameter: \param{x}
Value: \paramval{x}
Units: \paramunits{x}
\printparamtable
The length \param{length} is \paramval{length}\paramunits{length}
\begin{equation}
\param{length}=1320000\param{x}
\end{equation}
\end{document}