লেটেক্স ptionচ্ছিক যুক্তি


132

আপনি কীভাবে ল্যাটেক্সে alচ্ছিক আর্গুমেন্ট সহ একটি কমান্ড তৈরি করবেন? কিছুটা এইরকম:

\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
আমি মনে করি যে প্রশ্নটি একটি ডিফল্ট সরবরাহ না করে optionচ্ছিক যুক্তি দেওয়া হয়েছিল কিনা তা নির্ধারণ করতে হবে ।
কনরাড রুডলফ

43
যদিও এটি সত্য, আমি একটি ডিফল্ট যুক্তি সরবরাহ করার উপায় খুঁজতে গিয়ে এই প্রশ্নটি পেয়েছি, সুতরাং এই উত্তরটি আমার পক্ষে সবচেয়ে দরকারী useful
ট্যানার সোয়েট

26

"Alচ্ছিক যুক্তি" তৈরি করার পেছনের সাধারণ ধারণাটি হ'ল প্রথমে একটি মধ্যবর্তী কমান্ডটি সংজ্ঞায়িত করা যা টোকন স্ট্রিমের মধ্যে কী অক্ষরগুলি সামনে আসছে তা সনাক্ত করার জন্য স্ক্যান করে এবং তারপরে যথাযথভাবে উপস্থিত হওয়া আর্গুমেন্টগুলি প্রক্রিয়া করতে প্রাসঙ্গিক ম্যাক্রোগুলি সন্নিবেশ করায়। জেনেরিক টেক্স প্রোগ্রামিং ব্যবহার করে এটি বেশ ক্লান্তিকর (যদিও কঠিন নয়) হতে পারে। এই \@ifnextcharজাতীয় জিনিসগুলির জন্য ল্যাটেক্সগুলি বেশ কার্যকর।

আপনার প্রশ্নের সর্বোত্তম উত্তর হ'ল নতুন xparseপ্যাকেজটি ব্যবহার করা । এটি ল্যাটেক্স 3 প্রোগ্রামিং স্যুটের অংশ এবং এতে বেশিরভাগ স্বেচ্ছাসেবী alচ্ছিক যুক্তি সহ কমান্ড সংজ্ঞায়নের জন্য বিস্তৃত বৈশিষ্ট্য রয়েছে।

আপনার উদাহরণে আপনার কাছে একটি \secম্যাক্রো রয়েছে যা হয় হয় এক বা দুটি ব্রেসড আর্গুমেন্ট। এটি xparseনিম্নলিখিত ব্যবহার করে প্রয়োগ করা হবে :

\ Documentclass {নিবন্ধ}
\ Usepackage {xparse}
\ শুরু {ডকুমেন্ট}
\ ডক্লেয়ারডকামেন্ট কম্যান্ড \ সেকেন্ড {মিলিগ্রাম {{%
    {# 1%
        \ IfNoValueF {# 2} {এবং # 2}%
    }%
}
(\ সেকেন্ড {হ্যালো})
(\ সেকেন্ড {হ্যালো} {উচ্চ})
\ শেষ {ডকুমেন্ট}

যুক্তি যুক্তির { m g }সংজ্ঞা দেয় \sec; mএর অর্থ "বাধ্যতামূলক আর্গুমেন্ট" এবং gএটি "braচ্ছিক ব্রেসড আর্গুমেন্ট"। \IfNoValue(T)(F)এরপরে দ্বিতীয় যুক্তিটি সত্যই উপস্থিত ছিল কি না তা যাচাই করতে ব্যবহার করা যেতে পারে। অনুমোদিত অন্য ধরণের alচ্ছিক আর্গুমেন্টগুলির জন্য ডকুমেন্টেশন দেখুন।


4
ইচ্ছাশক্তি! এটা কাজ করে না. আউটপুট:(Hello and ) (Hello and Hi)
আলেক্সি মালিস্তভ

প্রতিক্রিয়ার জন্য ধন্যবাদ, আলেক্সি। আমার সন্দেহ হয় আপনি xparse এর পুরানো সংস্করণ ব্যবহার করছেন; সম্প্রতি এটির উপর অনেক কাজ হয়েছে। টেক্স লাইভ ২০০৯ সবে মুক্তি পেয়েছে :)
উইল রবার্টসন

24

উপরের সমস্তগুলি দুর্দান্তভাবে লেটেক্সে একটি সুন্দর, নমনীয় (বা একটি অতিরিক্ত বোঝা নিষিদ্ধ) ফাংশন তৈরি করা যেতে পারে !!! (এই টেক্স কোডটি আমার কাছে গ্রীকের মতো দেখাচ্ছে)

ভাল, শুধু আমার সাম্প্রতিক (যেমন নমনীয় নয়) বিকাশ যুক্ত করতে, আমি সম্প্রতি আমার থিসিস ডকটিতে যা ব্যবহার করেছি তা এখানে দিয়েছি

\usepackage{ifthen}  % provides conditonals...

"Alচ্ছিক" কমান্ডটি ডিফল্টরূপে ফাঁকা সেট করে কমান্ডটি শুরু করুন:

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

আমি তখন ম্যাক্রোটি একটি অস্থায়ী পরিবর্তনশীল সেট করে রেখেছি, \ অস্থায়ী {}, lyচ্ছিক যুক্তিটি ফাঁকা কিনা তা নির্ভর করে ভিন্নভাবে। এটি কোনও পাস হওয়া যুক্তিতে প্রসারিত হতে পারে।

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

এই ক্ষেত্রে আমি কেবলমাত্র একক, "alচ্ছিক" যুক্তি যা \ নতুন কম্যান্ড {} সরবরাহ করে তা পরীক্ষা করে দেখি। আপনি যদি এটির জন্য সেট আপ করেন তবে 3 টি "alচ্ছিক" আরোগুলি বলুন, আপনাকে এখনও 3 টি ফাঁকা আরগগুলি পাঠাতে হবে ... যেমন।

\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

আমি ভেবেছিলাম কমান্ডের পরে টেক্স প্রথম 'বক্স' এর উপযুক্ত প্যারামিটার হিসাবে বুঝতে পারে। এই 'বাক্স'টি কোঁকড়া ধনুর্বন্ধনীতে লেখা বা এটি একটি প্রতীক। অর্থাৎ। x^2+1বা x^{2+1} তাই আমার কাছে প্রশ্ন আছে, আপনার আদেশটি কি ধনুর্বন্ধকের উপস্থিতি পরীক্ষা করে? ল্যাটেক্স কমান্ড তৈরি করা সম্ভব \sec: কমান্ডের জন্য "A, b, c এবং d" \sec{A}[b,c,d], \sec{A}[b] and "A" for \ সেকেন্ড {A} `এর জন্য" A এবং b " ?
ক্রোলে

আপনার দুটি প্রশ্ন আছে। 1) হ্যাঁ, আমার কমান্ডটি ধনুর্বন্ধকের উপস্থিতি পরীক্ষা করে। 2) হ্যাঁ, এটা জন্য ম্যাক্রো তৈরি করা সম্ভব \sec{A}[b,c,d]বা \sec{A}[b]বা \sec{A}
আলেক্সি মালিস্তভ

6

আমার অনুরূপ সমস্যা হয়েছিল, যখন আমি একটি কমান্ড তৈরি করতে চেয়েছিলাম \dx, সংক্ষিপ্ত করতে \;\mathrm{d}x(অর্থাত্ ইন্টিগ্রালের ডিফারেনশনের আগে একটি অতিরিক্ত স্থান রেখে এবং "d" খাড়া করে রাখতে হবে)। তবে তারপরে আমি এটিকে ইন্টিগ্রেশনের ভেরিয়েবলটিকে optionচ্ছিক যুক্তি হিসাবে অন্তর্ভুক্ত করার জন্য যথেষ্ট নমনীয় করে তুলতে চাইছিলাম। আমি নিম্নলিখিত কোডটি উপস্থাপনে রেখেছি।

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

alচ্ছিক যুক্তি সহ 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"
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.