2010-07-19 14 views
33

में मैक्रोज़ को परिभाषित करने का सही तरीका this article लेखक एक पूर्ण वाक्य के बाद सही स्पैसिंग के बाद \ @ के उपयोग पर चर्चा करता है जो वाक्य के अंत में नहीं है उदा। श्री अर्थात आदिलेटेक्स

मैक्रो सुझाव

\newcommand\etc{etc\@ifnextchar.{}{.\@}} 

मामले (\etc more text) यह पैदा करता है (etc.more text) में के बाद से काफी सही नहीं है।

मैंने कई लेखकों को देखा है जिन्होंने \etc मैक्रो के अपने संस्करण बनाए हैं, अधिकतर etc.\ पर भिन्नताएं हैं।

\etc के लिए क्या मैक्रो, \ie, \etal, \eg ज्यादातर स्थितियों में सबसे अच्छा परिणाम?

क्या यह सामान्य रूप से हल होने के लिए स्वाद में कुछ व्यक्तिगत है?

+0

यह मेरी पसंदीदा अतः [लेटेक्स] एक लंबे समय में qn किया गया है। –

+2

मैंने अपने \ etc-like मैक्रोज़ के लिए \ xspace का उपयोग किया है, और इसे देखकर, यह मुझे गलत अंतर देता है और मैंने कभी नहीं देखा। मुझे खुशी है कि मैंने यह सवाल पढ़ा। –

+0

@ इवान - काउंटर उदाहरण क्या हैं? मैंने कुछ दिन पहले एक जवाब पोस्ट किया और बस यह टिप्पणी देखी। – Geoff

उत्तर

16

इससे पहले मैंने "एट अल।" आदि के लिए मैक्रोज़ का उपयोग किया था, लेकिन आजकल मैं लोगों को इस तरह के मैक्रोज़ को परिभाषित करने से हतोत्साहित करता हूं।

एक समस्या यह है कि आपने पहले ही देखा है: परिभाषाओं को सही तरीके से प्राप्त करना आश्चर्यजनक रूप से मुश्किल है ताकि वे सभी विशेष मामलों को सही तरीके से संभाल सकें (अन्य पैकेजों के साथ बातचीत सहित - उदाहरण के लिए, जो "\ cite" कमांड को फिर से परिभाषित करते हैं और संदर्भ से पहले tweak रिक्ति)।

लेकिन अधिक महत्वपूर्ण बात यह है, भले ही आप मैक्रो आपकी आवश्यकताओं के अनुरूप है कि का एक समूह है और आप उन्हें कैसे उपयोग करने के लिए पता है, अपने सह लेखक वास्तव में कैसे में सही ढंग से अपने मैक्रो का उपयोग करने के साथ भ्रमित होने की संभावना है विभिन्न विशेष मामलों।

इसलिए मैं अनुशंसा करता हूं कि आप "एट अल" जैसी छोटी चीजों के लिए मैक्रोज़ से बचें। और मानक लेटेक्स मार्कअप का उपयोग करके बस सबकुछ स्पेल करें। आखिरकार, ज्यादातर मामलों को किसी विशेष हैंडलिंग की आवश्यकता नहीं होती है ("उदाहरण के लिए" अक्सर अल्पविराम के बाद होता है; "एट अल।" अक्सर "~ \ cite" आदि के बाद होता है), और जब भी विशेष हैंडलिंग की आवश्यकता होती है, तो सभी लेटेक्स उपयोगकर्ताओं को पता होना चाहिए कि "\" और "\ @" जैसे कमांड का उपयोग कैसे करें।

+1

मैं आपके उत्तर की भावना "बीमारी से भी बदतर है" से सहमत हूं, लेकिन * सभी लेटेक्स उपयोगकर्ताओं को पता होना चाहिए कि "\" और "\ @" * जैसे कमांड का उपयोग कैसे किया जाए: क्या आप जानते थे कि टेक्स अतिरिक्त रखता है "।)" की अवधि के बाद अंतरिक्ष? यदि आपने किया, बधाई हो, आप एक कुलीन TeXnician हैं। यदि नहीं, तो आपको \ @ का उचित उपयोग नहीं पता था, जो कि सवाल का कारण बनता है। जिस तरह से टेक्स आपके पाठ को पचता है, वह बहुत मुश्किल है, मुश्किल है कि विल रॉबर्टसन जैसे किसी को पकड़ा जा सकता है। –

+0

चार्ल्स: ओह, क्षमा करें, मैं सरल (और अधिक आम) मामलों का जिक्र कर रहा था जो लगभग किसी भी लेटेक्स ट्यूटोरियल में शामिल हैं। निश्चित रूप से, मैं मानता हूं कि "।)" का मामला वास्तव में आश्चर्यजनक है, और मूल प्रश्न से कुछ नया सीखना अच्छा लगा।:) हालांकि, मुझे लगता है कि इस तरह की जटिलता मैक्रोज़ का उपयोग करके इसे ठीक करने का प्रयास करने का एक अच्छा कारण नहीं है ... –

+1

लगता है कि यह जाने का सबसे अच्छा तरीका है (कम से कम LaTeX3 मानक बनने तक)। –

1

सभी लाटेक्स आदेश उनके बाद अंतरिक्ष को खत्म करते हैं। क्योंकि आप जहां कमांड नाम समाप्त होता है स्पष्ट करने की आवश्यकता है

\etc\ and more 

यह आवश्यक है: यदि आप एक जगह चाहते हैं, आप इसे से बचने के लिए की जरूरत है। \etcno space सही ढंग से व्याख्या नहीं किया जा सकता है।

+0

लेकिन आप यह देखने के लिए देख सकते हैं कि अगला चरित्र कैटकोड 10 है, यह देखने के लिए कि क्या कोई स्थान होना चाहिए था: मेरा जवाब देखें। –

+0

हां, आप कर सकते हैं। मैं सिर्फ यह बता रहा हूं कि यह कैसे काम करता है। – Svante

+1

नाइटपिकिंग रखने के लिए खेद है: यह वास्तव में सच नहीं है कि सभी आदेश अंतरिक्ष को खत्म करते हैं: केवल उन अक्षरों से बना है (यानी, कैटकोड 10 वर्ण करते हैं)। अन्य आदेश सामान्य तरीके से परिभाषित किए गए हैं (यानी, '\ csname' का उपयोग नहीं करते) एक वर्ण लंबे नियंत्रण अनुक्रम होते हैं और अंतरिक्ष को घुमाते नहीं हैं। यही कारण है कि अगले चरित्र के कैटकोड को देखना एक अच्छा विचार है। –

5

एक तकनीकी चुनौती! हम अगले चरित्र के कैटकोड को देख कर रिक्त स्थान के बाद अक्षरों की समस्या से बच सकते हैं और देख सकते हैं कि यह एक पत्र है या नहीं; इस Latex3 के expl3 मैक्रो \peek_charcode:NTF साथ किया जा सकता (मेरी पहली expl3 कोड!):

\documentclass{article} 

\usepackage{expl3} 
\ExplSyntaxOn 
\newcommand\latinabbrev[1]{ 
    \peek_meaning:NTF . {% Same as \@ifnextchar 
    #1\@}% 
    { \peek_catcode:NTF a {% Check whether next char has same catcode as \'a, i.e., is a letter 
     #1.\@ }% 
    {#1.\@}}} 
\ExplSyntaxOff 

%Omit final dot from each def. 
\def\eg{\latinabbrev{e.g}} 
\def\etal{\latinabbrev{et al}} 
\def\etc{\latinabbrev{etc}} 
\def\ie{\latinabbrev{i.e}} 

\begin{document} 

Maybe a list, \eg, a, b, c, and d. Which is to say (\ie) a, b, \etc. Consider Knuth, \cf The TeXbook. 

\end{document} 

जुक्का की सलाह मुझे लगता है कि ध्वनि, हालांकि है: मैं कहेंगे समस्या विल उसे \ आदि मैक्रो के साथ चारों ओर काम करता है हम चाहिए टेक्स के डबल स्पेसिंग के कार्यान्वयन में एक बग के रूप में देखें (विल रॉबर्टसन को उसकी जांच के लिए पूछना चाहिए): यदि आपको पता है कि बग वहां है, तो आप इसे "।" जैसे मामलों में \ @ डालकर सीधे काम कर सकते हैं, या आप कर सकते हैं मुश्किल कोड है जिसका मतलब है कि आपको इस मामले में सोचने की ज़रूरत नहीं है, लेकिन आपने जिस तरह से टाइपसेट किया है, उसमें जटिलता को जोड़ा है जो आपके लिए अगली अप्रत्याशित गड़बड़ी के साथ काम नहीं करेगा, जिसे आपने शायद खुद को पेश किया है।

पोस्टस्क्रिप्ट पिछला संस्करण तय किया गया, धन्यवाद Joseph Wright noticing a stupid error tex.stackexchange.com पर।

+0

यह "et al।" है, "et alii" के लिए छोटा है। – Svante

+0

इसके अलावा, मेरा मानना ​​है कि "i.e." में थोड़ा, अटूट स्थान होना चाहिए और "उदा।"। – Svante

+0

@Svante: * et al। * - वास्तव में, निश्चित; * छोटी, अटूट जगह * - मैंने कभी इसके बारे में नहीं सुना है, और मैं इसे किसी भी पुस्तक में नहीं देख सकता: क्या आप निश्चित हैं? –

3

क्या आपने xspace पैकेज का उपयोग करने का प्रयास किया है?

उदाहरण मैक्रो:

\def\etc{etc.\@\xspace} 

कुछ परीक्षण:

Cat, dog, \etc. And so on. \\ 
Cat, dog, \etc! And so on. \\ 
Cat, dog, \etc, and so on. \\ 
Cat (dog, \etc). And so on. \\ 

का उत्पादन:

alt text


the documentation से

:

xspace पैकेज एक भी आदेश है कि क्या यह आदेश धारा में के बाद आता है पर लग रहा है प्रदान करता है, और निर्णय लेता है को बदलने के लिए खाली स्थान शामिल करने के लिए कि क्या TeX कमांड डीकोडर द्वारा "खाया"।

+3

आपको अपने पहले टेस्ट में संक्षेप की अवधि को गोद लेने की आवश्यकता है (यानी, नहीं "आदि .."), इसलिए आपको अगले चरित्र का परीक्षण करने की आवश्यकता है। लेकिन आप काफी सही हैं, xspace पैकेज का उपयोग बिल्ली कोड 10 के लिए स्पष्ट रूप से परीक्षण करने के बजाय किया जा सकता है। –

+0

ओह। वाह, अच्छा बिंदु। तो पहला उदाहरण गलत है। मुझे किसी भी तरह इस व्याकरण नियम से अवगत नहीं था। – Geoff

+0

तो, आपके उदाहरण में 'शायद एक सूची, \ उदाहरण के लिए,' एक सूची 'शायद एक सूची होनी चाहिए, उदाहरण के लिए,' क्योंकि आपके मैक्रो में समाप्ति अवधि नहीं है। अब मैं देखता हूं कि आप अपने मैक्रो में समाप्ति अवधि क्यों शामिल नहीं करते हैं। धन्यवाद। – Geoff

3

CVPR की शैली पैकेज में, यह के रूप में परिभाषित किया गया है:

\usepackage{xspace} 

% Add a period to the end of an abbreviation unless there's one 
% already, then \xspace. 
\makeatletter 
\DeclareRobustCommand\onedot{\futurelet\@[email protected]\@onedot} 
\def\@onedot{\ifx\@[email protected]\else.\null\fi\xspace} 

\def\eg{\emph{e.g}\onedot} \def\Eg{\emph{E.g}\onedot} 
\def\ie{\emph{i.e}\onedot} \def\Ie{\emph{I.e}\onedot} 
\def\cf{\emph{c.f}\onedot} \def\Cf{\emph{C.f}\onedot} 
\def\etc{\emph{etc}\onedot} \def\vs{\emph{vs}\onedot} 
\def\wrt{w.r.t\onedot} \def\dof{d.o.f\onedot} 
\def\etal{\emph{et al}\onedot} 
\makeatother