2010-01-27 62 views
35

Tôi đang cố gắng viết một lệnh ví dụ đơn giản để in không có gì mà không có một đối số, nhưng với một đối số nó bao quanh nó với một cái gì đó.Đối số mặc định LaTeX newcommand: trống?

Tôi đã đọc rằng giá trị mặc định nên được \@empty và điều kiện đơn giản \ifx\@empty#1 nên thực hiện công việc:

\newcommand{\optarg}[1][\@empty]{% 
\ifx\@empty#1 {} \else {(((#1)))} \fi 
} 

\optarg % (((empty))) 
\optarg{} % (((empty))) 
\optarg{test} % (((empty))) test 

Sau ba lệnh bài in từ empty đối với một số lý do, và tôi muốn là người đầu tiên hai để in không có gì và người cuối cùng in (((test))).

Tôi đang sử dụng TeXLive/Ubuntu. Một ý tưởng?

Trả lời

40

Thử nghiệm sau:

\documentclass{article} 

\usepackage{xifthen}% provides \isempty test 

\newcommand{\optarg}[1][]{% 
    \ifthenelse{\isempty{#1}}% 
    {}% if #1 is empty 
    {(((#1)))}% if #1 is not empty 
} 

\begin{document} 

Testing \verb|\optarg|: \optarg% prints nothing 

Testing \verb|\optarg[]|: \optarg[]% prints nothing 

Testing \verb|\optarg[test]|: \optarg[test]% prints (((test))) 

\end{document} 

Các xifthen package cung cấp \ifthenelse xây dựng và \isempty thử nghiệm.

Một tùy chọn khác là sử dụng gói ifmtarg (xem ifmtarg.sty file để biết tài liệu).

+0

Làm việc như một sự quyến rũ, cảm ơn bạn! :) – kolypto

8

Trong công cụ TeX cơ bản mà LaTeX được viết, số lượng đối số mà lệnh có thể thực hiện là cố định. Những gì bạn đã thực hiện với mặc định [\@empty] là yêu cầu LaTeX kiểm tra mã thông báo tiếp theo để xem đó có phải là một khung hình vuông mở không [. Nếu vậy, LaTeX lấy nội dung của các dấu ngoặc vuông làm đối số, nếu không, mã thông báo tiếp theo được đưa trở lại luồng đầu vào và đối số mặc định \@empty được sử dụng thay thế. Vì vậy, để có được ý tưởng của bạn để làm việc, bạn phải sử dụng vuông dấu ngoặc để phân định các đối số tùy chọn khi có mặt:

\optarg 
\optarg[] 
\optarg[test] 

Bạn nên có may mắn hơn với ký hiệu này.

Thật khó chịu khi bạn không thể sử dụng cùng một dấu ngoặc cho đối số tùy chọn khi bạn sử dụng cho đối số bắt buộc, nhưng đó là cách thực hiện.

+0

Wow, cảm ơn bạn! Không bao giờ nghĩ rằng dấu ngoặc là rất quan trọng. Tuy nhiên, vấn đề vẫn còn: '\ optarg' vẫn mang lại cho tôi' (((trống))) 'và' \ optarg [] = ((())) '(afaik điều này không hoạt động được). Chỉ '\ optarg [test]' bây giờ là '(((test)))' như mong đợi. – kolypto

+1

Thử '\ ifx! #! \ Else (((# 1))) \ fi' và tạo giá trị mặc định arg'! '. Nếu điều đó làm việc bạn có thể thay đổi '!' Thành một cái gì đó mà một người ít có khả năng sử dụng một cách tình cờ. –

11

Sử dụng gói xparse LaTeX3:

\usepackage{xparse} 
\NewDocumentCommand\optarg{g}{% 
    \IfNoValueF{#1}{(((#1)))}% 
} 
+0

Cảm ơn bạn, nó cũng hoạt động nhưng được thiết kế để sử dụng trong các gói AFAIK. – kolypto

+1

Mục tiêu của xparse là cung cấp giải pháp thay thế hoàn toàn cho \ newcommand. Không có lý do gì bạn không thể sử dụng nó cho lệnh một lần trong phần mở đầu của một tài liệu: tôi chắc chắn làm (nhưng sau đó tôi đã viết hầu hết việc thực hiện xparse hiện tại, mặc dù tôi nhấn mạnh rằng ý tưởng không thực sự của tôi). Ví dụ trong tài liệu chủ yếu là về các gói vào lúc này, nhưng tôi đã viết một bài báo TUGBoat cho vấn đề tiếp theo có một số "tài liệu" sử dụng. –

3
\documentclass{article} 

\usepackage{ifthen} % provides \ifthenelse test 
\usepackage{xifthen} % provides \isempty test 

\newcommand{\inlinenote}[2][]{% 
    {\bfseries{Note:}}% 
    \ifthenelse{\isempty{#1}} 
      {#2}    % if no title option given 
      {~\emph{#1} #2} % if title given 
} 

\begin{document} 

\inlinenote{ 
    simple note 
} 

\inlinenote[the title]{ 
    simple note with title 
} 

\end{document} 
Các vấn đề liên quan