LaTeX İsteğe Bağlı Bağımsız Değişkenler


Yanıtlar:


176

Kılavuzdan örnek :

\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
Sanırım soru, varsayılan değil, isteğe bağlı bir argümanın verilip verilmediğini nasıl belirleyeceğiydi .
Konrad Rudolph

43
Bu doğru olmasına rağmen, bu soruyu varsayılan bir argüman sağlamanın bir yolunu ararken buldum, bu yüzden bu cevap benim için en yararlı olanıydı.
Tanner Swett

26

"İsteğe bağlı bağımsız değişkenler" oluşturmanın arkasındaki genel fikir, ilk önce simge akışında hangi karakterlerin geleceğini saptamak için ileride tarayan ve ardından gelen bağımsız değişkenleri uygun şekilde işlemek için ilgili makroları ekleyen bir ara komut tanımlamaktır. Bu, genel TeX programlaması kullanıldığında oldukça sıkıcı olabilir (zor olmasa da). LaTeX'ler bu \@ifnextchartür şeyler için oldukça kullanışlıdır.

Sorunuza en iyi cevap, yeni xparsepaketi kullanmaktır . LaTeX3 programlama paketinin bir parçasıdır ve oldukça keyfi isteğe bağlı argümanlarla komutları tanımlamak için kapsamlı özellikler içerir.

\secÖrneğinizde, bir veya iki çapraz argüman alan bir makronuz var. Bu xparse, aşağıdakiler kullanılarak uygulanacaktır :

\ Documentclass {makale}
\ Usepackage {xparse}
{Document} başlayacak \
\ DeclareDocumentCommand \ sec {mg} {%
    {1.%
        \ IfNoValueF {# 2} {ve # 2}%
    }%
}
(\ Sn {Merhaba})
(\ Sek {Merhaba} {Ai})
\ Ucu {belge}

Argüman { m g }, argümanlarını tanımlar \sec; m"zorunlu argüman" anlamına gelir ve g"isteğe bağlı çaprazlı argüman" dır. \IfNoValue(T)(F)daha sonra ikinci argümanın gerçekten mevcut olup olmadığını kontrol etmek için kullanılabilir. İzin verilen diğer isteğe bağlı bağımsız değişken türleri için belgelere bakın.


4
Niyet! İşe yaramıyor. Çıktı:(Hello and ) (Hello and Hi)
Alexey Malistov

Geri bildirim için teşekkürler Alexey. Xparse'nin eski bir sürümünü kullandığınızdan şüpheleniyorum; son zamanlarda üzerinde çok çalışma yapıldı. TeX Live 2009 piyasaya çıktı :)
Will Robertson

24

Yukarıdakilerin tümü, LaTeX'te güzel, esnek (veya aşırı yüklenmiş bir işlevi yasaklamanın) olabileceğini gösteriyor !!! (bu TeX kodu bana yunanca gibi görünüyor)

Pekala, sadece son (esnek olmasa da) gelişimimi eklemek için, işte son zamanlarda tez dokümanımda kullandım

\usepackage{ifthen}  % provides conditonals...

Komutu, varsayılan olarak boş "isteğe bağlı" komut kümesiyle başlatın:

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

Daha sonra, isteğe bağlı bağımsız değişkenin boş olup olmamasına bağlı olarak makroyu geçici bir değişken (\ temp {}) ayarladım. Bu, geçirilen herhangi bir argümana genişletilebilir.

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

Ardından iki durum için \ temp {} değişkenini kullanarak makroyu çalıştırıyorum. (Burada, kısa başlığı, kullanıcı tarafından belirtilmemişse, uzun başlığa eşit olacak şekilde ayarlar).

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

Bu durumda, yalnızca \ newcommand {} 'ın sağladığı tek, "isteğe bağlı" bağımsız değişkeni kontrol ederim. Örneğin 3 "isteğe bağlı" bağımsız değişken için ayarlayacak olsaydınız, yine de 3 boş değiştirge göndermeniz gerekir ... ör.

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

Bu oldukça aptalca, biliyorum, ama bu LaTeX ile gideceğim kadarıyla - TeX koduna bakmaya başladığımda o kadar da mantıklı değil ... Bay Robertson'un xparse yöntemini beğeniyorum, belki de ben Deneyeceğim ...


Bu yaklaşımı beğendim. Daha "programlama benzeri" ve bu nedenle okunması daha kolay. Aferin!
sevdim.by. İsa

11

İhtiyacınız olan tek şey şudur:

\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'in komuttan sonraki ilk 'kutuların' sayısını uygun parametreler olarak anladığını düşündüm. bu 'kutu' kaşlı ayraçlarla yazılır veya bir semboldür. Yani. x^2+1veya x^{2+1} Öyleyse sorum var, komutunuz diş tellerinin varlığını test ediyor mu? LaTeX komutunu \secüreterek yaratmak mümkün mü : komut için "A, b, c ve d" \sec{A}[b,c,d], \sec{A}[b] and "A" for \ sec {A} ` için" A ve b " ?
Crowley

İki sorunuz var. 1) Evet, komutum diş tellerinin varlığını test ediyor. 2) Evet, \sec{A}[b,c,d]veya \sec{A}[b]veya için makro oluşturmak mümkündür \sec{A}.
Alexey Malistov

6

Bir komut oluşturmak istediğimde \dx, kısaltmak istediğimde benzer bir problem yaşadım \;\mathrm{d}x(yani integralin diferansiyelinden önce fazladan bir boşluk koyun ve "d" nin de dik olmasını sağlayın). Ama sonra, entegrasyon değişkenini isteğe bağlı bir argüman olarak dahil edecek kadar esnek hale getirmek istedim. Aşağıdaki kodu giriş kısmına koydum.

\usepackage{ifthen}

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

Sonra

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

isteğe bağlı bağımsız değişkenle \ dx verir


-1

İşte benim girişimim, sizin şartlarınıza tam olarak uymuyor. Tam olarak test edilmedi, bu yüzden dikkatli olun.

\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"
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.