2010-01-27 8 views
35

Estoy tratando de escribir un comando de ejemplo simple que no imprime nada sin un argumento, pero con un argumento lo rodea con algo.LaTeX newcommand argumento predeterminado: ¿está vacío?

He leído que el valor por defecto debe ser \@empty y el simple \ifx\@empty#1 condición debe hacer el trabajo:

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

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

Los últimos tres comandos todo Imprimir la palabra empty por alguna razón, y quiero que la primera dos para imprimir nada y el último para imprimir (((test))).

Estoy usando TeXLive/Ubuntu. ¿Ideas?

Respuesta

40

Prueba el siguiente ensayo:

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

El xifthen package proporciona el \ifthenelse constructo y la prueba de \isempty.

Otra opción es utilizar el paquete ifmtarg (consulte el documento ifmtarg.sty file para obtener la documentación).

+0

¡Funciona como un amuleto, gracias! :) – kolypto

8

En el motor TeX subyacente con el que se escribe LaTeX, la cantidad de argumentos que un comando puede tomar es fija. Lo que ha hecho con el valor predeterminado [\@empty] es pedirle a LaTeX que examine el siguiente token para ver si es un corchete abierto [. Si es así, LaTeX toma el contenido de corchetes como el argumento, si no, el próximo token se vuelve a colocar en la secuencia de entrada y el argumento predeterminado \@empty se usa en su lugar. Así que para conseguir su idea de trabajar, usted tiene que utilizar cuadrado soportes para delimitar el argumento opcional cuando está presente:

\optarg 
\optarg[] 
\optarg[test] 

usted debe tener más suerte con esta notación.

Es molesto que no puedas usar los mismos corchetes para un argumento opcional como el que usas para un argumento requerido, pero así son las cosas.

+0

Wow, gracias! Nunca pensé que los corchetes fueran tan importantes. Sin embargo, el problema persiste: '\ optarg' todavía me da' (((vacío))) 'y' \ optarg [] = ((())) '(afaik esto no debería funcionar de todos modos). Solo '\ optarg [test]' ahora es '(((prueba)))' como se esperaba. – kolypto

+1

Pruebe '\ ifx! #! \ Else (((# 1))) \ fi' y cree el arg predeterminado'! '. Si eso funciona, puede cambiar el '!' A algo que es menos probable que alguien use por accidente. –

11

Usando el paquete xparse LaTeX3:

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

Gracias, eso también funciona, pero está diseñado para ser utilizado en paquetes AFAIK. – kolypto

+1

El objetivo de xparse es proporcionar una alternativa completa a \ newcommand. No hay ninguna razón por la que no pueda usarlo para un comando único en el preámbulo de un documento: ciertamente lo hago (pero luego escribí la mayor parte de la implementación actual de xparse, aunque enfatizo que las ideas no son realmente mío). El ejemplo en la documentación se trata principalmente de paquetes en este momento, pero he escrito un artículo de TUGBoat para el próximo número que tiene algunos usos de "documentos". –

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} 
Cuestiones relacionadas