2017-07-18 55 views
2

我想對某些LaTex文件運行自動的「拼寫檢查」(除了拼寫檢測某些自定義單詞等)外。我需要閱讀LaTex文件,找到文檔文本中的某些單詞(即,如果它們是LaTeX標記代碼的一部分,則忽略單詞),然後將每個單詞包裝在額外的LaTeX高亮標記中並將文件寫回。例如。使用python修改LaTex文件中的單詞,忽略LaTeX標記

\title{My Document} 
... 
I won the title! 

如果我搜索「title」,那麼它應該忽略「\ title」。

這是爲了讓渲染時,改性的膠乳將使用高亮我添加例如顯示找到的話:

\title{My Document} 
... 
I won the \colorbox{red}{title}! 

庫將是有益的,因爲我最終可能需要額外的解析/控制功能,但簡單的修改是我現在需要的。

看起來困難的部分是從實際正文文本中辨別LaTex命令,註釋等。

謝謝。

回答

1

您需要一個Python LaTeX解析器來執行此操作。這看起來像一個很好的候選人https://github.com/alvinwan/TexSoup,那裏有幾個可用。

就像BeautifulSoup一樣,有搜索功能可以讓你找到所有的文本節點,然後你可以使用普通的Python拆分/搜索功能找到拼錯的單詞,然後用一組新的乳膠節點替換文本節點用所選單詞的包裝語法)。

TexSoup的文檔是如何將文檔寫回有點不清楚,但看着他們的源代碼,他們似乎覆蓋repr功能,所以:

with open('out.tex','w') as f: 
    f.write(repr(soup)) 

應該爲你做到這一點。

編輯:

如果你看一下descendants發電機:

>>> [x for x in soup.descendants if isinstance(x, str)] 
['\x08egin', '(n.) A sacred fruit. Also known as:', '\x08egin', 'Here is the prevalence of each synonym.', '\x08egin', 'red lemon & uncommon ', 'Hello \textit', '.', 'Watermelon', 'red lemon', 'life', 'itemize', '& common', 'tabular', 'document'] 

的 「孩子」 是str S和TexNode個組合。你可以在那裏挑選出純粹的字符串作爲你的支票,然後你自己走路。該children屬性bizzarely只包括TextNode元素。

+0

謝謝 - 我有TexSoup(作爲Latex2Python的一部分)。你知道我怎樣才能「找到所有的文本節點」?文件很輕鬆,當然。我可能還需要檢查部分標題等內容中的「文本」。 – jqwha

+0

感謝您的接受。一直在看TextSoup代碼。你說得對,他們的文檔很糟糕。堅持,編輯未來... – keredson

+0

感謝您的調查!我有一個這樣的遞歸的代碼塊,但是當我修改str值時,它們不會在源「湯」對象中更新。呸!一定是做錯了! – jqwha

0

因爲我得到了你需要的東西,Python不應該是最好的儀器。我認爲你需要的是sedvim編輯器和一組編輯腳本。它的工作速度更快,並且比編寫python腳本更易於維護。

+0

我認爲最難的部分是從身體文本辨別LaTex文本。當然,簡單的搜索和替換非常簡單。 – jqwha

+0

嗯,看你的例子 > f我搜索「title」,那麼它應該忽略「\ title」。 使用前導字符'vim'很容易 – alexcleac

+0

我只是不知道sed正則表達式的語法,但我認爲它大部分是相似的。 你可以在'vim'中使用這樣的正則表達式'%s/[^ \\] \ zstitle/goooo/g'來完成。'goooo'就是這個例子,你可以用你想要的代替它 – alexcleac