2009-11-28 13 views
88

लाटेक्स में वैकल्पिक तर्कों के साथ आप कमांड कैसे बनाते हैं? कुछ की तरह:लाटेक्स वैकल्पिक तर्क

\newcommand{\sec}[2][]{ 
    \section*{#1 
     \ifsecondargument 
      and #2 
     \fi} 
    } 
} 

फिर, मैं guide से की तरह

\sec{Hello} 
%Output: Hello 
\sec{Hello}{Hi} 
%Output: Hello and Hi 
+5

प्रासंगिक प्रश्न: [साथ और वैकल्पिक तर्क के बिना विभिन्न आदेश परिभाषाओं] (http://tex.stackexchange.com/q/308/1347) । –

उत्तर

111

उदाहरण यह कॉल कर सकते हैं:

\newcommand{\example}[2][YYY]{Mandatory arg: #2; 
           Optional arg: #1.} 

This defines \example to be a command with two arguments, 
referred to as #1 and #2 in the {<definition>}--nothing new so far. 
But by adding a second optional argument to this \newcommand 
(the [YYY]) the first argument (#1) of the newly defined 
command \example is made optional with its default value being YYY. 

Thus the usage of \example is either: 

    \example{BBB} 
which prints: 
Mandatory arg: BBB; Optional arg: YYY. 
or: 
    \example[XXX]{AAA} 
which prints: 
Mandatory arg: AAA; Optional arg: XXX. 
+15

मुझे लगता है कि प्रश्न यह निर्धारित करने के बारे में था कि * एक वैकल्पिक तर्क दिया गया था, डिफ़ॉल्ट प्रदान नहीं किया गया था। –

+28

हालांकि यह सच है, मुझे डिफ़ॉल्ट प्रश्न प्रदान करने के तरीके की तलाश करते हुए यह प्रश्न मिला, इसलिए यह उत्तर मेरे लिए सबसे उपयोगी था। –

18

बनाने "वैकल्पिक तर्क" के पीछे सामान्य विचार है पहले परिभाषित करने के लिए एक इंटरमीडिएट कमांड जो यह पता लगाने के लिए आगे स्कैन करता है कि टोकन स्ट्रीम में कौन से वर्ण आ रहे हैं और फिर तर्कों को संसाधित करने के लिए प्रासंगिक मैक्रोज़ को सम्मिलित करते हैं के रूप में उपयुक्त। जेनेरिक टीएक्स प्रोग्रामिंग का उपयोग करके यह काफी कठिन हो सकता है (हालांकि मुश्किल नहीं)। LaTeX का \@ifnextchar ऐसी चीजों के लिए काफी उपयोगी है।

अपने प्रश्न का सबसे अच्छा जवाब नया xparse पैकेज का उपयोग करना है। यह LaTeX3 प्रोग्रामिंग सूट का हिस्सा है और इसमें कई मनमानी वैकल्पिक तर्कों के साथ कमांड को परिभाषित करने के लिए व्यापक सुविधाएं शामिल हैं।

आपके उदाहरण में आपके पास \sec मैक्रो है जो या तो एक या दो ब्रेस्ड तर्क लेता है। इस के साथ xparse का उपयोग कर लागू किया जाएगा निम्नलिखित:

 
\documentclass{article} 
\usepackage{xparse} 
\begin{document} 
\DeclareDocumentCommand\sec{ m g }{% 
    {#1% 
     \IfNoValueF {#2} { and #2}% 
    }% 
} 
(\sec{Hello}) 
(\sec{Hello}{Hi}) 
\end{document} 

तर्क { m g }\sec के तर्कों परिभाषित करता है; m का अर्थ है "अनिवार्य तर्क" और g "वैकल्पिक ब्रेस्ड तर्क" है। \IfNoValue(T)(F) का उपयोग यह जांचने के लिए किया जा सकता है कि दूसरा तर्क वास्तव में मौजूद था या नहीं। अन्य प्रकार के वैकल्पिक तर्कों के लिए प्रलेखन देखें जिन्हें अनुमति है।

+4

विल! यह काम नहीं करता। आउटपुट: '(हैलो और) (हैलो और हाय)' –

+0

प्रतिक्रिया के लिए धन्यवाद, एलेक्सी। मुझे संदेह है कि आप xparse के पुराने संस्करण का उपयोग कर रहे हैं; हाल ही में बहुत सारे काम किए गए हैं। टीएक्स लाइव 200 9 अभी जारी किया गया है :) –

12

आपको बस निम्नलिखित है:

\makeatletter 
\def\sec#1{\def\tempa{#1}\futurelet\next\[email protected]}% Save first argument 
\def\[email protected]{\ifx\next\bgroup\expandafter\[email protected]\else\expandafter\[email protected]\fi}%Check brace 
\def\[email protected]#1{\section*{\tempa\ and #1}}%Two args 
\def\[email protected]{\section*{\tempa}}%Single args 
\makeatother 

\sec{Hello} 
%Output: Hello 
\sec{Hello}{Hi} 
%Output: Hello and Hi 
+0

मैंने सोचा था कि टीएक्स कमांड के बाद पहले 'बक्से' की उचित गणना के पैरामीटर के रूप में समझता है। यह 'बॉक्स' घुंघराले ब्रेसिज़ में लिखा गया है या यह एक प्रतीक है। अर्थात। 'x^2 + 1' या' x^{2 + 1} ' तो मेरे पास सवाल है, क्या आपकी कमांड परीक्षण ब्रेसिज़ की उपस्थिति है? क्या यह संभव है कि लाटेक्स कमांड '\ sec' उत्पादन करना संभव हो: कमांड' \ sec {ए} [बी, सी, डी] ', " ए और बी "के लिए" ए, बी, सी और डी " \ sec {ए} [बी] और "ए" '\ sec {ए}' के लिए? – Crowley

+0

आपके दो प्रश्न हैं। 1) हां, ब्रेसिज़ की मेरी कमांड टेस्ट उपस्थिति। 2) हां, '\ sec {ए} [बी, सी, डी]' या '\ sec {ए} [बी]' या '\ sec {ए}' के लिए मैक्रो बनाना संभव है। –

-1

यहाँ मेरी प्रयास है, यह आपके चश्मा वास्तव में हालांकि पालन नहीं करता। पूरी तरह से परीक्षण नहीं किया गया है, तो सावधान रहें।

\newcount\seccount 

\def\sec{% 
    \seccount0% 
    \let\go\secnext\go 
} 

\def\secnext#1{% 
    \def\last{#1}% 
    \futurelet\next\secparse 
} 

\def\secparse{% 
    \ifx\next\bgroup 
     \let\go\secparseii 
    \else 
     \let\go\seclast 
    \fi 
    \go 
} 

\def\secparseii#1{% 
    \ifnum\seccount>0, \fi 
    \advance\seccount1\relax 
    \last 
    \def\last{#1}% 
    \futurelet\next\secparse 
} 

\def\seclast{\ifnum\seccount>0{} and \fi\last}% 

\sec{a}{b}{c}{d}{e} 
% outputs "a, b, c, d and e" 

\sec{a} 
% outputs "a" 

\sec{a}{b} 
% outputs "a and b" 
17

ऊपर शो कठिन सब के सब इसे बनाने के लिए किया जा सकता है एक अच्छा लचीला (या एक ओवरलोड न करे) LaTeX में समारोह !!! अच्छी तरह से (कि टेक्स कोड मेरे लिए यूनानी तरह दिखता है)

, बस मेरी हाल ही में (यद्यपि के रूप में लचीला नहीं) विकास को जोड़ने के लिए, यहाँ है कि मैं क्या हाल ही में मेरी थीसिस दस्तावेज़ में इस्तेमाल किया गया है, साथ

\usepackage{ifthen} % provides conditonals... 

प्रारंभ आदेश, "वैकल्पिक" कमांड डिफ़ॉल्ट रूप से खाली सेट के साथ:

\newcommand {\figHoriz} [4] [] { 

मैं तो मैक्रो है, एक अस्थायी चर, \ अस्थायी {} सेट अलग ढंग पर किया जाए या नहीं वैकल्पिक तर्क खाली है निर्भर करता है। इसे किसी भी पारित तर्क के लिए बढ़ाया जा सकता है।

\ifthenelse { \equal {#1} {} } %if short caption not specified, use long caption (no slant) 
    { \def\temp {\caption[#4]{\textsl{#4}}} } % if #1 == blank 
    { \def\temp {\caption[#1]{\textsl{#4}}} } % else (not blank) 

फिर मैं दो मामलों के लिए \ temp {} चर का उपयोग कर मैक्रो चलाता हूं। (यहां यह केवल लंबे कैप्शन के बराबर शॉर्ट-कैप्शन सेट करता है यदि यह उपयोगकर्ता द्वारा निर्दिष्ट नहीं किया गया था)।

\begin{figure}[!] 
    \begin{center} 
     \includegraphics[width=350 pt]{#3} 
     \temp %see above for caption etc. 
     \label{#2} 
    \end{center} 
\end{figure} 
} 

इस मामले में मैं केवल एकल, "वैकल्पिक" तर्क की जांच करता हूं जो \ newcommand {} प्रदान करता है। यदि आप इसे सेट अप करना चाहते हैं, तो कहें, 3 "वैकल्पिक" तर्क, आपको अभी भी 3 रिक्त तर्क भेजना होगा ... उदाहरण के लिए।

\MyCommand {first arg} {} {} {} 

जो बहुत मूर्ख, मुझे पता है, लेकिन इस बारे में के रूप में दूर है के रूप में मैं LaTeX के साथ जाने के लिए जा रहा हूँ - यह सिर्फ इतना है कि एक बार sensical नहीं है मैं टेक्स कोड देख शुरू ... मैं श्री पसंद करते हैं रॉबर्टसन के xparse विधि हालांकि, शायद मैं यह कोशिश करता हूँ ...

+0

मुझे यह दृष्टिकोण पसंद है। अधिक "प्रोग्रामिंग जैसी" है और इसलिए पढ़ने में आसान है। बहुत बढ़िया! –

1

मैं एक ऐसी ही समस्या थी, जब मैं एक आदेश, \dx बनाने के लिए, \;\mathrm{d}x संक्षिप्त करना चाहता था (यानी अभिन्न के अंतर से पहले एक अतिरिक्त स्थान रख दिया और "डी" भी सही है)। लेकिन फिर भी मैं एक वैकल्पिक तर्क के रूप में एकीकरण के चर को शामिल करने के लिए पर्याप्त लचीला बनाना चाहता था। मैंने प्रस्ताव में निम्नलिखित कोड डाला।

\usepackage{ifthen} 

\newcommand{\dx}[1][]{% 
    \ifthenelse{ \equal{#1}{} } 
     {\ensuremath{\;\mathrm{d}x}} 
     {\ensuremath{\;\mathrm{d}#1}} 
} 

फिर

\begin{document} 
    $$\int x\dx$$ 
    $$\int t\dx[t]$$ 
\end{document} 

\dx with optional argument देता

संबंधित मुद्दे