编辑(修改问题的修改答案)

编辑(修改问题的修改答案)

我正在写一篇论文,需要报告多个方差分析的结果。报告格式如下: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但我的个人偏好是始终避免并根据我打算如何使用它来编写宏。

相关内容