سؤال

وكيف يمكن خلق أمر مع الوسائط الاختيارية في اللثي؟ شيء من هذا القبيل:

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

وبعد ذلك، يمكن أن أدعو عليه

\sec{Hello}
%Output: Hello
\sec{Hello}{Hi}
%Output: Hello and Hi
هل كانت مفيدة؟

المحلول

مثال من href="http://tex.loria.fr/ctan-doc/macros/latex/doc/html/usrguide/node18.html" دليل :

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

نصائح أخرى

والفكرة العامة وراء خلق "الوسائط الاختيارية" هو تحديد أول أمر المتوسطة التي تفحص قدما لكشف ما الحروف والخروج المقبل في مجرى رمزية ومن ثم إدراج وحدات الماكرو ذات الصلة لمعالجة الحجة (ق) الخروج كما مناسب. وهذا يمكن أن تكون مملة جدا (على الرغم من أن ليس من الصعب) باستخدام البرمجة تكس العامة. \@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) يمكن استخدامها للتحقق ما إذا كانت الحجة الثانية موجودة أم لا في الواقع. راجع وثائق لأنواع أخرى من الوسائط الاختيارية المسموح بها.

وجميع من العرض أعلاه صعوبة يمكن أن يكون لجعل لطيفة ومرنة (أو سمح لطاقتها) وظيفة في اللثي !!! (هذا الرمز تكس يشبه اليونانية لي)

حسنا، فقط لإضافة بلدي الأخيرة (وإن لم يكن كما مرونة) التنمية، وهنا ما لقد استعملت مؤخرا في بلدي وثيقة الأطروحة، مع

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

وبعد ذلك أقوم بتشغيل الماكرو باستخدام \ مؤقت {} المتغير للحالتين. (ومن هنا فقط يحدد-شرح قصيرة لتعادل التسمية التوضيحية طويلة إذا لم يتم تحديد من قبل المستخدم).

\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} {} {} {}

والتي هي سخيفة جدا، وأنا أعلم، ولكن هذا عن بقدر ما انا ذاهب الى الذهاب مع مطاط - انها مجرد أنه ليس sensical مرة واحدة تبدأ في النظر في قانون تكس ... أنا لا أحب طريقة xparse السيد روبرتسون على الرغم من ، ربما سأحاول ذلك ...

وكل ما تحتاجه هو ما يلي:

\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

وكان لي مشكلة مماثلة، عندما أردت أن تخلق أمر، \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 مع سيطة اختيارية

وهنا محاولة مني، فإنه لا يتبع المواصفات الخاصة بك على الرغم بالضبط. لا اختبارها بشكل كامل، لذا يجب الحذر.

\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"
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top