2010-03-15 76 views
2

是否有可能有一個TeX命令將整個下一個單詞(或下一個字母直到但不包括下一個標點符號)作爲參數,而不僅僅是下一封信或{}組?Tex命令影響下一個完整的單詞

我想對某些縮寫詞有一個\ caps命令,但不想一遍又一遍地輸入大括號。命令後

+0

如果沒有那麼多縮略詞,可以考慮將\ caps命令定義爲\ caps {word},然後爲每個命令分別命令\ newcommand {\ NIMBY} {\ caps {nimby}} – 2010-03-15 14:05:54

+0

我知道,我通常會這樣做,但如果沒有遵循\或{},則此解決方案傾向於吞噬空白。另外,這意味着我需要爲這些單詞保留一個單獨的列表。根據具體情況,這可能是也可能不是個好主意。 – Debilski 2010-03-15 14:09:04

回答

1

首先創建命令,例如

\def\capsimpl#1{{\sC#1}}% Your main macro 

解決辦法趕上空格或標點符號:

\catcode`\@=11 
\def\addtopunct#1{\expandafter\let\csname [email protected]\meaning#1\endcsname\let} 
\addtopunct{ } 
\addtopunct{.} \addtopunct{,} \addtopunct{?} 
\addtopunct{!} \addtopunct{;} \addtopunct{:} 

\newtoks\capsarg 
\def\caps{\capsarg{}\futurelet\punctlet\capsx} 
\def\capsx{\expandafter\ifx\csname [email protected]\meaning\punctlet\endcsname\let 
     \expandafter\capsend 
     \else \expandafter\continuecaps\fi} 

\def\capsend{\expandafter\capsimpl\expandafter{\the\capsarg}} 
\def\continuecaps#1{\capsarg=\expandafter{\the\capsarg#1}\futurelet\punctlet\capsx} 

\catcode`\@=12 
+0

謝謝。這看起來不錯。 – Debilski 2010-03-17 20:27:36

1

關於空白:看包裝xspacehttp://www.tex.ac.uk/cgi-bin/texfaq2html?label=xspace

現在爲什麼這是非常困難的:正如你指出你自己,這樣的事情只能通過改變catcodes完成的,它似乎。當TeX讀取它們時,CatCodes被分配給字符,而TeX每次讀取一行,所以你不能對同一行上的其他空格做任何事情,恕我直言。可能有解決辦法,但我沒有看到它。


危險代碼在下面!

該代碼會做你想要在該行的到底是什麼,所以如果你想要的是不帶括號更多的「流暢」打字,但你願意每個縮寫後打「迴歸」(與不運行任何自動縮進後),您可以使用此:

\def\caps{\begingroup\catcode`^^20 =11\mcaps} 
\def\mcaps#1{\def\next##1 {\sC#1##1\catcode`^^20 =10\endgroup\ }\next} 
+0

這也很好,我認爲在某個時候我知道這個軟件包存在。 – Debilski 2010-03-15 15:27:36

+0

我認爲,它*可能*可能使用內部宏來檢查每個字符,並根據該字母的值(或catcode),字母被更改或宏從循環返回。我只是嘗試了一點點,但我一直在等\ par錯誤等。 – Debilski 2010-03-15 19:38:46

0

一種解決方案可能設置另一個字符作爲活躍和使用轉義這一個。這不會消除對結尾字符的需要,但可以避免鍵入\caps宏,從而使鍵入更容易。

因此在非常特殊的情況下,以下工作。

\catcode`\*=\active 
\def*#1*{\textsc{\MakeTextLowercase{#1}}} 

Now follows an *Acronym*. 

不幸的是,這使得\section*{}無法使用,無需額外的宏定義。

在的XeTEX,這似乎是可能利用此Unicode字符,所以一個可以定義

\catcode`\•=\active 
\def•#1•{\textsc{\MakeTextLowercase{#1}}} 

Now follows an •Acronym•. 

這應該減少對其他命令的影響,但當然需要有字符「•」映射到鍵盤的某個地方使用。

1

@Debilski - 我寫了類似的東西到您的活動*代碼,我的論文中的縮寫詞。我激活了<,然後激活了\ def <#1>以打印首字母縮寫詞,以及第一次遇到時的擴展名。如果在聲明之前使用它們,或者在首字母縮寫詞的首字母縮寫時報告錯誤,我也可以通過允許定義擴展內聯並使用.aux文件將「擴展時間」從未宣佈。

總的來說,這似乎是當時的一個好主意 - 我很少需要<在我的實際文本中是catcode 12(因爲我所有的宏都是在單獨的。sty文件),並且我讓它在數學模式下運行,所以我無法預見任何困難。但是男孩是脆弱的......我不知道有多少次我通過改變看似無關的東西而意外地破壞了我的構建。因此,所有這一切說,是小心激活甚至是遠程常用的字符。另一方面,使用XeTeX和更高級別的Unicode字符可能會更安全,並且通常可以輕鬆地鍵入這些額外字符,例如製作多個(或組合)鍵(我通常會映射numlock或者是其中的一個窗口鍵),以便例如多-!-!產生¡)。或者如果你在emacs中運行,你可以使用C- \短暫地切換到TeX輸入模式,通過爲它輸入TeX命令來插入unicode(儘管這實際上是輸入TeX文檔的一個痛苦,因爲它攔截了你實際的\請注意,請不要嘗試定義自己的轉義字符!)

+0

是的,我認爲你是對的,這可能會在一些意想不到的地方變得非常糟糕。我總是有這樣的想法,即使用所有這些markdown-to-tex轉換器,應該有可能將這種轉換器實際上用作「簡單」tex包。我仍然認爲有可能在某些方面,但它會對你在tex中的實際寫作提出很多其他限制。 雖然Unicode看起來好多了,但是如果你從中竊取太多字符,你實際上否認了xetex的所有優點,因爲你不能再真正寫unicode。 – Debilski 2010-03-20 14:05:22

+0

\ def <#1>將很好的解析html ... – Debilski 2010-03-20 14:08:36

+0

這幾乎是。問題在於諸如''這是完全有效的HTML。 – Steve 2010-03-21 05:36:10