如何定義一個LaTeX行內代碼環境?
我想要行內代碼原樣輸出, {}等特殊字元不需要轉義就能原樣輸出,還要能自動換行,單詞斷詞換行時最好能用連字元-連接。
用過verb命令,但不能自動換行,用過lstinline,但這個和verb差不多,也不能自動換行。閱讀過listings宏包說明,並沒有發現lstinline的設置選項。
為什麼 verb 命令中空格不能斷行?
因為在使用 verb 後,空格字元臨時被定義為一個宏 @xobeysp,這個宏展開是
obreakspace。
為什麼 verb 中單詞不能加連字元斷詞?
因為 verb 使用的字體 tfamily 默認本身就不能斷詞。為什麼 tfamily 默認不能斷詞?
因為在定義相關字體族時,會用 hyphenchar 顯式定義該字體連字元的編碼為 -1,意思就是禁用連字元。
此外,除非使用 LuaTeX,TeX 還規定一段第一個單詞不能斷詞。這也會禁止一部分 verb 中的斷詞。
參考 LaTeX 內核中 verb 的實現,我們可以一一解決此問題:- 讓空格可以斷行同時不被吃掉,可以重定義 @xobeysp 為 hspace{0pt}mbox{ }hspace{0pt}
- 允許連字元,可以重設 hyphenchar
- 在 verb 開始處增加 hspace*{0pt} 設置一個虛擬詞,以允許第一個詞後斷開。
不過呢,這個要求比較怪。主要是連字元。需要使用特殊字元的代碼中所有字元都可能是有特別意義的,通常都不能接受混入多餘的連字元,以免與減號之類的混淆。
而如果只是允許空格斷行的話,不需要上面的方式,很多宏包就可以完成了。例如 listings 可以全局或局部設置 breaklines 選項,如果你仔細讀文檔了的話。
documentclass{article}
usepackage{etoolbox}
makeatletter
def@xobeysp{hspace{0pt}mbox{ }hspace{0pt}}
apptoverbatim@font{hyphencharfont`-
elax}
apptocmd@sverb{hspace*{0pt}}{}{}
makeatother
usepackage{listings}
lstset{basicstyle={
ormalfontsffamily},breaklines}
egin{document}
parindent=0pt
hsize=4em
verb|#Hyphenation# and %allowlinebreak%|
lstinline|this is also breakable|
end{document}

注意 listings 的斷行規則可能嚴一些,空格也是可伸縮的。此外,如果是 url、文件路徑之類東西,用 url 宏包的 url 更好。它的實現原理與 verb 之類命令不大一樣,斷行規則也不同。
我覺得minted宏包可以解決你的問題,請看文檔中的行內代碼環境,還自帶高亮的。
不過斷詞這個功能我不清楚能不能實現,私以為題主的想法不太合理啊,代碼本身是個抄錄環境,怎麼可以斷詞呢?
推薦閱讀:
※XeLaTeX 編譯時間太長是什麼原因?
※LaTeX 與 TeX 有什麼本質區別?
※LaTeX 中用 listings 為什麼輸出結果和程序編譯器里的有差別(對齊格式)?
