LaTeX वैकल्पिक तर्क


132

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

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

फिर, मैं इसे पसंद कर सकता हूं

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

जवाबों:


176

गाइड से उदाहरण :

\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.

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

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

26

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

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

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

\ Documentclass {} लेख
\ Usepackage {} xparse
\ Begin {document}
\ DeclareDocumentCommand \ sec {mg} {%
    {# 1%
        \ IfNoValueF {# 2} {और # 2}%
    }%
}
(\ सेकंड {हैलो})
(\ सेकंड {हैलो} {हाय})
\ अंत {document}

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


4
मर्जी! यह काम नहीं करता। आउटपुट:(Hello and ) (Hello and Hi)
एलेक्सी मालिस्टोव 13

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

24

उपरोक्त सभी मुश्किल यह है कि यह LaTeX में एक अच्छा, लचीला (या एक अतिभारित) मना करने के लिए हो सकता है !!! (वह TeX कोड मेरे लिए ग्रीक जैसा दिखता है)

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

\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 रिक्त args भेजना होगा ... उदा।

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

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


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

11

आपको केवल निम्नलिखित की आवश्यकता है:

\makeatletter
\def\sec#1{\def\tempa{#1}\futurelet\next\sec@i}% Save first argument
\def\sec@i{\ifx\next\bgroup\expandafter\sec@ii\else\expandafter\sec@end\fi}%Check brace
\def\sec@ii#1{\section*{\tempa\ and #1}}%Two args
\def\sec@end{\section*{\tempa}}%Single args
\makeatother

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

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

आपके दो सवाल हैं। 1) हां, मेरे आदेश में ब्रेसिज़ की उपस्थिति का परीक्षण किया गया है। 2) हाँ, यह के लिए मैक्रो बनाने के लिए संभव है \sec{A}[b,c,d]या \sec{A}[b]या \sec{A}
एलेक्सी मालिस्टोव

6

मुझे एक समान समस्या थी, जब मैं एक कमांड बनाना चाहता था \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 देता है


-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"
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.