我有一个LaTeX表(下面是片段),它包含每个\ underset之后的两个值(值1:标准错误;值2:估计)。我想通过将\ bf {}添加到每个\ underset之后的第二个值进行编辑,只要第二个值除以第一个值大于2或小于-2。
例如,在第一个\ underet之后(在'拦截'之后),-9.686 / 1.742是< -2,因此我希望原始的{-9.686}读作\ bf {-9.686}。我有数百个变量,因此不首选手动。我只用notepad ++工作,但如果有必要可以尝试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}
答案 0 :(得分: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
- 列规范的顶部表相同,而底部表使用新定义的C
- 列规范。后者拦截\underset
的设置以修改第二个参数的字体。
collcell
package用于捕获第2-8列中每个单元格的内容。它们必须与$\underset{#1}{#2}$
形式完全匹配,以便将其转换为$\underset{#1}{\mathbf{#2}}$
。 array
package通过新定义的列简化了单元格集合(简化了代码)。
有些注意事项:
我使用了复制列说明符*{<num>}{<col spec>}
,它重复列规范<col spec>
总共<num>
次。它使代码更具可读性。
使用\mathbf
代替与文字相关的\bf
。请参阅Does it matter if I use \textit
or \it
, \bfseries
or \bf
, etc.和Will two-letter font style commands (\bf
, \it
, …) ever be resurrected in LaTeX?
不要反复复制相同的原始概念,而是定义一个可以使用的宏(参见Consistent typography)。通过这种方式,它可以让您了解内容,如果您改变主意,可以轻松操作。例如,
\newcommand{\stderrest}[2]{$\underset{(#1)}{#2}$}% \stderrest{<stderr>}{<est>}
然后在需要此类设置的任何地方使用\stderrest{<stderr>}{<est>}
。这样,格式化的更新就像
\renewcommand{\stderrest}[2]{$\underset{(#1)}{\mathbf{#2}}$}% \stderrest{<stderr>}{<est>}
你已经完成了。
不要在浮动内使用center
环境;而是使用\centering
。作为参考,请参阅Should I use \center
or \centering
for figures and tables?
使用\makeatletter
... \makeatother
对只是因为我定义了一个与您的规范输入相匹配的特定“内部”命令。这不是必要的,可以改变。但有关详细信息,请参阅What do \makeatletter
and \makeatother
do?
如果您在新定义的C
- 列中有一个没有$\underset{#1}{#2}$
表格的单元格,则需要使用\multicolumn{1}{c|}{..}
来避免收集该单元格。
...无论如何都要添加一个条件语句,只在
\mathbf
的{{1}}之前插入{#2}
当且仅当{#2}
的绝对值除以{#1}
大于2?截至目前,它为\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
提供定点算术来调节某些变量的值。我确定更新的代码是不言自明的。
答案 1 :(得分: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进行比较并返回修改后的字符串或整个匹配。