4

我有一个 LaTeX 表(下面是片段),在每个 \underset 之后包含两个值(值 1:标准误差;值 2:估计)。我想通过在每个 \underset 之后将 \bf{} 添加到第二个值来进行编辑,只要第二个值除以第一个值大于 2 或小于 -2。

例如,在第一个 \underset 之后(在 'intercept' 之后),-9.686/1.742 小于 -2,因此我希望原始 {-9.686} 读取为 \bf{-9.686}。我有数百个变量,因此不建议手动进行。我只使用记事本++,但如有必要可以尝试Python。对于 PC 的正则表达式和/或合适的平台(编辑器/解析器等)的任何提示将不胜感激。

documentclass[letter]{article}
\usepackage{amsmath, amsthm, amssymb}  % Additional math packages

\begin{document}

\begin{table}[hptb]
\begin{center}
\begin{tabular}{|l||c|c|c|c|c|c|c|} \hline

(Intercept)&$\underset{(1.742)}{-9.686}$&$\underset{(0.907)}     
{-9.085}$&$\underset{(0.663)}{-9.724}$&$\underset{(0.565)}{-9.077}$&$\underset{(0.619)} 
{-7.601}$&$\underset{(0.838)}{-5.273}$&$\underset{(1.120)}{-3.417}$\\ 
\end{tabular}
\end{center}
\end{table}
\end{document}

我希望输出表像这样读取。

输出表:

\begin{document}

\begin{table}[hptb]
\begin{center}
\begin{tabular}{|l||c|c|c|c|c|c|c|} \hline

(Intercept)&$\underset{(1.742)}{\bf{-9.686}}$&$\underset{(0.907)}
{\bf{-9.085}}$&$\underset{(0.663)}{-9.724}$&$\underset{(0.565)}{\bf{-
-9.077}}$&$\underset{(0.619)}{\bf{-7.601}}$&$\underset{(0.838)} 
{-5.273}$&$\underset{(1.120)}{-1.417}$\\ 
\end{tabular}
\end{center}
\end{table}
\end{document}
4

2 回答 2

5

这可以完全在 LaTeX 中完成......

在此处输入图像描述

\documentclass{article}
\usepackage{amsmath,collcell,array}% http://ctan.org/pkg/{amsmathm,collcell,array}
\makeatletter
\def\insertbf@$\underset#1#2${$\underset{#1}{\mathbf{#2}}$}
\newcommand{\insertbf}[1]{\expandafter\insertbf@#1}
\newcolumntype{C}{>{\collectcell\insertbf}c<{\endcollectcell}}
\makeatother
\begin{document}

\begin{table}[hptb]
  \centering
  \begin{tabular}{|l||*{7}{c|}} \hline
    (Intercept) & $\underset{(1.742)}{-9.686}$ & $\underset{(0.907)}{-9.085}$ & $\underset{(0.663)}{-9.724}$
      & $\underset{(0.565)}{-9.077}$ & $\underset{(0.619)}{-7.601}$ & $\underset{(0.838)}{-5.273}$ 
      & $\underset{(1.120)}{-3.417}$
  \end{tabular}

  \bigskip

  \begin{tabular}{|l||*{7}{C|}} \hline
    (Intercept) & $\underset{(1.742)}{-9.686}$ & $\underset{(0.907)}{-9.085}$ & $\underset{(0.663)}{-9.724}$
      & $\underset{(0.565)}{-9.077}$ & $\underset{(0.619)}{-7.601}$ & $\underset{(0.838)}{-5.273}$ 
      & $\underset{(1.120)}{-3.417}$
  \end{tabular}  
\end{table}
\end{document}

在上面的示例中,两个表都相同,顶部的表使用常规c-column 规范,而底部的表使用新定义的C-column 规范。后者截取 的设置\underset来修改第二个参数的字体。

collcell用于捕获第 2-8 列中每个单元格的内容。它们必须与表单完全匹配$\underset{#1}{#2}$,才能将其转换为$\underset{#1}{\mathbf{#2}}$. 该array通过新定义的列简化了单元格收集(简化了代码)。

需要注意的一些事项:

  • 我使用了一个复制列说明符,它总共*{<num>}{<col spec>}重复列说明。它使代码更具可读性。<col spec><num>

  • 使用\mathbf而不是与文本相关的\bf. 请参阅如果我使用or or​​是否重要\textit\it\bfseries\bf,以及两个字母的字体样式命令 ( \bf, \it, ...) 是否会在 LaTeX 中复活?

  • 与其一遍又一遍地重复相同的原始概念,不如定义一个您可以使用的宏(请参阅一致的排版)。通过这种方式,它可以让您深入了解内容,如果您改变主意,您可以轻松操作这些内容。例如,

    \newcommand{\stderrest}[2]{$\underset{(#1)}{#2}$}% \stderrest{<stderr>}{<est>}
    

    然后\stderrest{<stderr>}{<est>}在需要这种东西的地方使用。这样,格式的更新就像

    \renewcommand{\stderrest}[2]{$\underset{(#1)}{\mathbf{#2}}$}% \stderrest{<stderr>}{<est>}
    

    你就完成了。

  • 不要使用center浮子内部的环境;而是使用\centering. 作为参考,请参阅我应该使用\center\centering用于图形和表格吗?

  • 使用\makeatletter...\makeatother对只是因为我定义了一个与您的规范输入相匹配的特定“内部”命令。这不是真正必要的,可以更改。但有关这方面的更多信息,请参阅做什么\makeatletter\makeatother做什么?

  • 如果新定义的C-column 中有一个没有$\underset{#1}{#2}$表单的单元格,则需要使用\multicolumn{1}{c|}{..}它来避免它被收集。


...无论如何要添加一个条件语句,该语句仅在当且仅当除以的绝对值大于 2时才插入\mathbf先验?截至目前,它会将.{#2}{#2}{#1}\mathbf{#2}

对于变量的条件格式,这里有一个选项:

在此处输入图像描述

\documentclass{article}
\usepackage{amsmath,collcell,array}% http://ctan.org/pkg/{amsmathm,collcell,array}
\usepackage[nomessages]{fp}% http://ctan.org/pkg/fp
\makeatletter
\let\stderr@format\relax
\def\stripparen@(#1){#1}% Remove parentheses
\def\insertbf@$\underset#1#2${%
  \FPabs\resultA{#2}% Absolute value of #2
  \edef\resultB{\stripparen@#1}% Extract std err
  \FPeval\result{\resultA / \resultB}% Divide est / std err
  \FPifgt\result{2}\let\stderr@format\mathbf\fi%
  $\underset{#1}{\stderr@format{#2}}$}%
\newcommand{\insertbf}[1]{\expandafter\insertbf@#1}
\newcolumntype{C}{>{\collectcell\insertbf}c<{\endcollectcell}}
\makeatother
\begin{document}

\begin{table}[hptb]
  \centering
  \begin{tabular}{|l||*{7}{c|}} \hline
    (Intercept) & $\underset{(1.742)}{-9.686}$ & $\underset{(0.907)}{-9.085}$ & $\underset{(0.663)}{-9.724}$
      & $\underset{(0.565)}{-9.077}$ & $\underset{(0.619)}{-7.601}$ & $\underset{(0.838)}{-5.273}$ 
      & $\underset{(1.120)}{-3.417}$
  \end{tabular}

  \bigskip

  \begin{tabular}{|l||*{7}{C|}} \hline
    (Intercept) & $\underset{(1.742)}{-9.686}$ & $\underset{(0.907)}{-9.085}$ & $\underset{(0.663)}{-9.724}$
      & $\underset{(0.565)}{-9.077}$ & $\underset{(0.619)}{-7.601}$ & $\underset{(0.838)}{-5.273}$ 
      & $\underset{(1.120)}{-3.417}$
  \end{tabular}  

  \bigskip

  \begin{tabular}{|l||*{7}{C|}} \hline
    (Intercept) & $\underset{(1.742)}{-2.686}$ & $\underset{(0.907)}{-9.085}$ & $\underset{(0.663)}{-9.724}$
      & $\underset{(0.565)}{-9.077}$ & $\underset{(0.619)}{-7.601}$ & $\underset{(0.838)}{-1.273}$ 
      & $\underset{(1.120)}{-3.417}$
  \end{tabular}  
\end{table}
\end{document}

fp提供定点算法来条件某些变量的值。我确信更新的代码是不言自明的。

于 2013-08-03T16:13:53.137 回答
1

Python 的一个例子:

#!/usr/bin/python

import re

data = r'''documentclass[letter]{article}
\usepackage{amsmath, amsthm, amssymb}  % Additional math packages

\begin{document}

\begin{table}[hptb]
\begin{center}
\begin{tabular}{|l||c|c|c|c|c|c|c|} \hline

(Intercept)&$\underset{(1.742)}{-9.686}$&$\underset{(0.907)}     
{-9.085}$&$\underset{(0.663)}{-9.724}$&$\underset{(0.565)}{-9.077}$&$\underset{(0.619)} 
{-7.601}$&$\underset{(0.838)}{-5.273}$&$\underset{(1.120)}{-3.417}$\\ 
\end{tabular}
\end{center}
\end{table}
\end{document}'''

print re.sub(r'(\\underset{\()(-?[0-9]+(?:\.[0-9]+)?)(\)}\s*{)(-?[0-9]+(?:\.[0-9]+)?)(?=}\$)',
    lambda m: m.group(1)+m.group(2)+m.group(3)+'\\bf{'+m.group(4)+'}'
        if abs(float(m.group(4))/float(m.group(2)))>2 else m.group(0), data)

简而言之,这个想法是捕获两个值以传递给 lambda 函数,该函数将商的绝对值与 2 进行比较,并返回修改后的字符串或整个匹配项。

于 2013-08-03T03:55:47.317 回答