我正在写一篇论文,需要报告多个方差分析的结果。报告格式如下:F 1,16 =5.06,磷=.009。我想要一个可以帮我完成这种格式化的工具,这样我就可以很容易地在整个文本的格式之间切换,例如允许我将其更改为 F(1,16)=5.06,磷=.009,甚至F(1,16)=5.06,磷如果我们想得更具体一点,则为 <.01。编辑:对于 P<.01 选项,理想的解决方案是用户可以添加 ~3 个显著性水平,例如 P<.05、P<.01 和 P<.001,然后该函数会根据报告的值自动分配其中一个。
我猜想这将采用允许其工作的自定义函数的格式:\reportANOVA{1,16,5.06,.009}
使用类似这样的函数
reportANOVA <- function{DFN,DFD,F,P}{
return(F\textsubscript{DFN,DFD}=F, \textit{p}=P)
}
函数的结果需要在文本内。
在 LaTeX 中可以实现这样的事情吗?我只用了一周左右,所以我对它了解不多,但显然在其他编程语言中也可以实现类似的事情(我在这里使用了 R 的语法)。
由于我被要求添加 MW*E,所以这里有一个:
\documentclass{article}
\usepackage{fixltx2e}
%Function in the preamble like this
reportANOVA <- function{DFN,DFD,F,P}{
return(F\textsubscript{DFN,DFD}=F, \textit{p}=P)
}
\begin{document}
Stats are \reportANOVA{1,16,5.06,.009}
\end{document}
*显然这不起作用。
答案1
以下是您所有要求的实现:
\documentclass{article}
\usepackage{xparse}
\ExplSyntaxOn
\NewDocumentCommand{\reportANOVA}{O{}m}
{
\group_begin:
\keys_set:nn { vousden/report } { #1 }
\vousden_report:n { #2 }
\group_end:
}
\NewDocumentCommand{\setreportANOVA}{m}
{
\keys_set:nn { vousden/report } { #1 }
}
\keys_define:nn { vousden/report }
{
< .bool_set:N = \l_vousden_report_round_bool,
< .initial:n = false,
< .default:n = true,
func .bool_set:N = \l_vousden_report_func_bool,
func .default:n = true,
func .initial:n = false,
levels .clist_set:N = \l_vousden_report_levels_clist,
levels .initial:n = { .05 , .01 , .001 }
}
\seq_new:N \l_vousden_report_args_seq
\cs_new_protected:Npn \vousden_report:n #1
{
\seq_set_split:Nnn \l_vousden_report_args_seq { , } { #1 }
\vousden_report_format:
}
\cs_new_protected:Npn \vousden_report_format:
{
$F
\bool_if:NTF \l_vousden_report_func_bool
{
(
\__vousden_report_item:n { 1 },
\__vousden_report_item:n { 2 }
)
}
{
\c_math_subscript_token
{
\__vousden_report_item:n { 1 },
\__vousden_report_item:n { 2 }
}
}
= \__vousden_report_item:n { 3 } $,~
$p
\bool_if:NTF \l_vousden_report_round_bool
{
\__vousden_report_round:f { \__vousden_report_item:n { 4 } }
}
{
= \__vousden_report_item:n { 4 }
}
$
}
\cs_new:Npn \__vousden_report_item:n #1
{
\seq_item:Nn \l_vousden_report_args_seq { #1 }
}
\cs_new_protected:Npn \__vousden_report_round:n #1
{
\clist_map_inline:Nn \l_vousden_report_levels_clist
{
\fp_compare:nT { #1 <= ##1 } { \tl_set:Nn \l_tmpa_tl { ##1 } }
}
\fp_compare:nTF { #1 == \l_tmpa_tl } { = } { < } \l_tmpa_tl
}
\cs_generate_variant:Nn \__vousden_report_round:n { f }
\ExplSyntaxOff
\begin{document}
Stats are \reportANOVA{1,16,5.06,.009}
Stats are \reportANOVA[func]{1,16,5.06,.009}
Stats are \reportANOVA[<]{1,16,5.06,.009}
Stats are \reportANOVA[func,<]{1,16,5.06,.001}
\setreportANOVA{func,<}
Stats are \reportANOVA{1,16,5.06,.009}
\end{document}
可以指定的键是
<
选择“级别”格式页func
用于选择“函数”格式levels
用于说明级别(默认.05,.01,.001
);如果指定,级别应按降序表示
您可以使用它\setreportANOVA
来决定从那时起的格式(尊重分组),或者在可选参数中指定键。
请注意,如果页等于所选级别之一,即使已指定密钥,=
也会使用它来代替。<
<
答案2
\newcommand*\reportANOVA[1]{\reportANOVAaux#1\relax}
\def\reportANOVAaux#1,#2,#3,#4\relax{\ensuremath{F_{#1,#2}=#3},\ \ensuremath{p=#4}}
原因是\ensuremath
因为我不知道你想在哪里使用它,无论
in text mode \reportANOVA{1,2,3,4} or in math mode
\[
\reportANOVA{5,6,7,8}
\]
已编辑以支持<
版本。该\reportANOVA
命令以“默认方式”工作,使用星号\reportANOVA*{..}
可以触发一些数字比较:如果第四个参数小于 0.001,则p < 0.001
打印;如果第四个参数小于 0.01,则p < 0.01
打印;如果它更大,则我们打印p < 0.05
(这里没有检查,所以我们假设它总是小于那个)。您可能想要查看siunitx
以格式化数字,但在这个小例子中似乎没有必要。
\documentclass{scrartcl}
\usepackage{xparse}
\ExplSyntaxOn
\NewDocumentCommand \reportANOVA { s m }
{
\IfBooleanTF{#1}
{ \vousden_report_anova_alt:wwww #2 \q_stop }
{ \vousden_report_anova:wwww #2 \q_stop }
}
\cs_new_protected:Npn \vousden_report_anova:wwww #1 , #2 , #3 , #4 \q_stop
{ \ensuremath { F \sb{ #1 , #2 } = #3 }, \ \ensuremath { p = #4 } }
\cs_new_protected:Npn \vousden_report_anova_alt:wwww #1 , #2 , #3 , #4 \q_stop
{
\group_begin:
\fp_compare:nNnTF { #4 } < { 0.001 }
{ \fp_set:Nn \l_tmpa_fp { 0.001 } }
{
\fp_compare:nNnTF { #4 } < { 0.01 }
{ \fp_set:Nn \l_tmpa_fp { 0.01 } }
{ \fp_set:Nn \l_tmpa_fp { 0.05 } }
}
\ensuremath { F \sb{ #1 , #2 } = #3 }, \ \ensuremath { p < \fp_use:N \l_tmpa_fp }
\group_end:
}
\ExplSyntaxOff
\begin{document}
Foo \reportANOVA{1,16,5.06,.009} bar \reportANOVA*{1,16,5.06,.009} baz
\[
\reportANOVA*{1,16,5.06,.0007} \quad \textrm{and} \quad \reportANOVA*{1,16,5.06,.04}
\]
\end{document}
答案3
编辑(修改问题的修改答案)
这用于xparse
定义命令和 TiKZ 数学库来处理值的比较。
\reportANOVA{}
接受 1 个强制参数。- 当以这种方式使用时,任何可选参数都会被丢弃。
- 在这种情况下,强制参数应由 4 个用逗号分隔的值组成,与问题中请求的语法相对应。
- 例如
\reportANOVA{1,3,4,56.9943}
。 - 第四是价值页。(所以永远不应该
56.9943
!)
\reportANOVA*[]{}
接受 1 个强制参数和 1 个可选参数。- 此星号表格测试页根据要求,针对 3 个值。
- 默认情况下,这些是 0.001、0.01 和 0.05。
- 如果指定了可选参数,则应在逗号分隔的列表中提供 3 个值。
- 所以
\reportANOVA*[0.001,0.01,0.05]{10,4.5,6,0.0345}
等同于\reportANOVA*{10,4.5,6,0.0345}
。 - 传递给可选参数的值会按顺序尝试,因此应首先给出最小的值。
- 也就是说,
\reportANOVA*[0.001,0.01,0.05]{10,4.5,6,0.0045}
不会产生与相同的结果\reportANOVA*[0.05,0.001,0.01]{10,4.5,6,0.0045}
。 - 如果页超过所有三个测试值,则将改用标准、无星号格式。
- 否则,页将被指定为小于该声明为真的三个值中的第一个值。
代码:
\documentclass{article}
\usepackage{xparse,tikz}
\usetikzlibrary{math}
\makeatletter
\NewDocumentCommand\reportANOVA{ s > { \SplitArgument { 2 } { , } } O{.001,.01,.05} > { \SplitArgument { 3 } { , } } m }{%
\IfBooleanTF {#1}{%
\@reportANOVA* #2#3}{%
\@reportANOVA #2#3}}
\NewDocumentCommand\@reportANOVA { s G{.001} G{.01} G{.05} m m m m }{%
\IfBooleanTF {#1}{%
\tikzmath{
if #8 < #2 then { print $F_{#5,#6} = #7, P<#2$; } else {%
if #8 < #3 then { print $F_{#5,#6} = #7, P<#3$; } else {%
if #8 < #4 then { print $F_{#5,#6} = #7, P<#4$; }
else {%
print $F_{#5,#6} = #7, P=#8$;
};
};
};
}
}{%
$F_{#5,#6} = #7, P=#8$}}
\makeatother
\begin{document}
\reportANOVA{1,16,5.06,.009}
\reportANOVA*{1,16,5.06,.009}
\reportANOVA*{1,16,5.06,.04}
\reportANOVA*[.025,.05,.075]{1,16,5.06,.01}
\reportANOVA*[.025,.05,.075]{1,16,5.06,.05}
\end{document}
简单案例(原始答案)
这是一个xparse
解决方案。我把这个函数当作数学来处理,但显然,如果愿意的话,你可以将格式指定为文本。
\documentclass{article}
\usepackage{xparse}
\makeatletter
\NewDocumentCommand\reportANOVA{ > { \SplitArgument { 3 } { , } } m }{%
\@reportANOVA #1}
\NewDocumentCommand\@reportANOVA { m m m m }{%
$F_{#1,#2} = #3, P=#4$}
\makeatother
\begin{document}
\reportANOVA{1,16,5.06,.009}
\end{document}
答案4
你需要这样的东西:
\newcommand\ANOVA[4]{$F_{#1,#2}=#3$, $P=#4$} % for F_{1,16}=5.06, P=0.009}
\newcommand\ANONA[4]{$F(#1,#2)=#3$, $P=#4$}
这是使用推荐的 latex 语法。然后您可以使用这些命令
\ANOVA{1}{16}{5.06}{0.009}
更好的替代方法是 TeX\def
命令:
\def\ANONA(#1,#2,#3,#4){$F_{#1,#2}=#3$, $P=#4$}
现在只需输入 \ANONA(1,16,50.06,0.009)。
但是,有一个注意事项,这取决于您打算如何使用它们。我编写这些宏时假设您想在文本中使用它们。如果您想在数学中使用它们,请删除上面的所有美元符号。您也可以使用来定义宏,\ensuremath
但我的个人偏好是始终避免并根据我打算如何使用它来编写宏。