2012-07-26 46 views
3

我有一個LaTeX表的字符串。我試圖找到第n個(比方說第三個)列,並將所有內容都包裹起來,比如說\emph{},而不是與分隔的美元符號相匹配。使用正則表達式在LaTeX表中找到(並替換)第n列

我正在尋找第二列的第一個&...&。然後找到下一個&...&這是第二個分組,並非巧合表中的第三列。

我虛擬的例子工作,但有點不同,因爲它有兩個&...&之間的文本。稍後我會解決一些小問題 - 我需要在\emph{}呼叫之外使用後退和前轉參考&

xy <- "This is &more or less& a match and here is &another one&.\nSecond line with &occurrance 1& and &occurrance 2&" 
gsub("(&.*?&)|(.*?&)(.*)(&.*?&)", "\\1\\2\\3\\\\emph{\\4}", xy, perl = TRUE) 
[1] "This is &more or less& a match and here is \\emph{&another one&}.\nSecond line with &occurrance 1& and \\emph{&occurrance 2&}" 

當我用LaTeX表格(bam!)將它踢出一個缺口時,它有點不同。兩個&...&之間沒有字符,這意味着一個&與兩列相鄰。考慮到這一點,我刪除了(.*)。無論我嘗試什麼,我都無法讓這個工作。有小費嗎?

library(xtable) 
data(tli) 
tli.table <- xtable(tli[1:5,]) 
x <- print.xtable(tli.table, print.results = FALSE, include.rownames = FALSE) 

cat(x) 
% latex table generated in R 2.15.1 by xtable 1.7-0 package 
% Thu Jul 26 14:13:39 2012 
\begin{table}[ht] 
\begin{center} 
\begin{tabular}{rlllr} 
    \hline 
grade & sex & disadvg & ethnicty & tlimth \\ 
    \hline 
    6 & M & YES & HISPANIC & 43 \\ 
    7 & M & NO & BLACK & 88 \\ 
    5 & F & YES & HISPANIC & 34 \\ 
    3 & M & YES & HISPANIC & 65 \\ 
    8 & M & YES & WHITE & 75 \\ 
    \hline 
\end{tabular} 
\end{center} 
\end{table} 

gsub("(&.*?&)(&.*?&)", "\\1\\\\emph{\\2}", x, perl = TRUE) 
+0

在LaTeX中是否有相同的美元符號字符'$'列結尾,也是下一列的開始位置?換句話說:'0 $ 123 $ 456 $ 789 $ 0'意味着'456'是第二列? – 2012-07-26 12:41:08

+0

@ΩmegaLaTeX'表格行的結構是'col1 $ col2 $ col3 \\\',所以\\是行尾。沒有明確的「起始行」字符。 – 2012-07-26 12:42:46

+0

所以第一列不以'$'開頭 - 正確嗎?最後一個也不會以'$'結尾......? – 2012-07-26 12:43:54

回答

4

假設1 ST柱是n <- 1(而不是n <- 0),你應該更換第n列的使用正則表達式應該是:然後

(?m)^(?=[^&\n\r]*&)((?:[^&]*&){n-1})\\s*([^&]*?)\\s*(&|\\\\) 
           ↑ 
           └ replace this n-1 with real number 

和替換字符串必須是\\1\\\\emph{\\2}\\3

所以,你的替換代碼:

input <- "% latex table generated in R 2.15.1 by xtable 1.7-0 package\n% Thu Jul 26 17:49:09 2012\n\\begin{table}[ht]\n\\begin{center}\n\\begin{tabular}{rlllr}\n \\hline\ngrade & sex & disadvg & ethnicty & tlimth \\\\ \n \\hline\n 6 & M & YES & HISPANIC & 43 \\\\ \n 7 & M & NO & BLACK & 88 \\\\ \n 5 & F & YES & HISPANIC & 34 \\\\ \n 3 & M & YES & HISPANIC & 65 \\\\ \n 8 & M & YES & WHITE & 75 \\\\ \n \\hline\n\\end{tabular}\n\\end{center}\n\\end{table}\n" 

n <- 1 
regex <- paste(c('(?m)^(?=[^&\n\r]*&)((?:[^&]*&){', n-1, '})\\s*([^&]*?)\\s*(&|\\\\)'), collapse='') 
cat(gsub(regex, "\\1\\\\emph{\\2}\\3", input, perl = TRUE)) 
+0

我正在努力使這項工作,堅持下去。 R需要\已經逃脫了,所以\ 1是恰當的。 – 2012-07-26 13:12:54

+0

刪除'$'後,這似乎適用於第一行。有沒有一種方法可以說服正則表達式在其餘行中做同樣的事情? – 2012-07-26 13:53:54

+0

如果我添加'(?m)^',那麼匹配之前的所有內容都會消失。 – 2012-07-26 15:31:13

2

另一種方法是在emph{}來包裝你列調用xtable前:

data(tli) 
tli[, 4] <- paste0("\\\\emph{", tli[, 4], "}") 

然後你的腳本,你有它:

tli.table <- xtable(tli[1:5,]) 
x <- print.xtable(tli.table, print.results = FALSE, include.rownames = FALSE) 
cat(x) 

產生以下,它應該給所需的資源ults:

% latex table generated in R 2.15.0 by xtable 1.7-0 package 
% Thu Jul 26 16:08:58 2012 
\begin{table}[ht] 
\begin{center} 
\begin{tabular}{rlllr} 
    \hline 
grade & sex & disadvg & ethnicty & tlimth \\ 
    \hline 
    6 & M & YES & $\backslash$$\backslash$emph\{HISPANIC\} & 43 \\ 
    7 & M & NO & $\backslash$$\backslash$emph\{BLACK\} & 88 \\ 
    5 & F & YES & $\backslash$$\backslash$emph\{HISPANIC\} & 34 \\ 
    3 & M & YES & $\backslash$$\backslash$emph\{HISPANIC\} & 65 \\ 
    8 & M & YES & $\backslash$$\backslash$emph\{WHITE\} & 75 \\ 
    \hline 
\end{tabular} 
\end{center} 
\end{table} 
+0

是的,這是一種可能性。但是,如果您有ANOVA表,這不起作用。它們通常被傳遞給xtable以在LaTeX中進行漂亮的打印,在這種情況下,必須使用xtable對象。 – 2012-07-26 15:29:24