Criar comando com opcional

507 views
Skip to first unread message

LG

unread,
Feb 9, 2012, 11:57:32 AM2/9/12
to Latex-br
Boa tarde,

Sou novo em LaTeX (menos de um mês que descobrir esta maravilhosa
ferramenta), e com estou estou començando a estudar alguns comando
internos, etc, para aprender a definir algumas macros.


E gostaria de saber como se faz para criar uma macro com um argumento
opcional!!!


Criei estas duas macros


\def\prof#1{Prof. #1}

\prof{Luiz Gustavo}

Prof. Luiz Gustavo



e a outra para o feminino



\def\prof#1#2{Profª. #1}

\prof{Paula}

Profª. Paula


ou até mesmo esta, (que eu acho que seria a correta para definir o
comando)

\def\prof[#1]#2{Prof$^#1$}. #2}

\prof[a]{Paula}

Profª. Paula


resumindo, heheheheh
queria saber como criar o comando com os seguintes resultados


\prof{Luiz Gustavo}

Prof. Luiz Gustavo


\prof[a]{Paula}

Profª. Paula


FHRB Toledo

unread,
Feb 9, 2012, 12:11:26 PM2/9/12
to late...@googlegroups.com
LG,

Você pode implementar isso por meio da lógica ifthen (idem a qq linguagem)... Um exemplo torpe:

\usepackage{ifthen}

\newcommand*{\nome}{LG} % Um nome qualquer
\newcommand*{\sexo}[1]{\ifthenelse{\equal{#1}{homem}}{Senhor \nome}{Senhora \nome}} % regra p/ o sexo do nome

e no seu documento você usa:

\begin{document}

...

\sexo{homem}

...

\end{document}

Deve haver um jeito bem menos naif de se fazer isso, usando um só \newcommand*! Se avançar nesse intento reporte-nos!

abraço,
FH

2012/2/9 LG <lgro...@gmail.com>

Eduardo M KALINOWSKI

unread,
Feb 9, 2012, 1:54:05 PM2/9/12
to late...@googlegroups.com
On 02/09/2012 02:57 PM, LG wrote:
> Boa tarde,
>
> Sou novo em LaTeX (menos de um m�s que descobrir esta maravilhosa
> ferramenta), e com estou estou comen�ando a estudar alguns comando

> internos, etc, para aprender a definir algumas macros.
>
>
> E gostaria de saber como se faz para criar uma macro com um argumento
> opcional!!!
>
>
> Criei estas duas macros
>
>
> \def\prof#1{Prof. #1}
>
> \prof{Luiz Gustavo}
>
> Prof. Luiz Gustavo

Por que usar comandos de baixo n�vel? Use os comandos do Latex, \newcommand.

> e a outra para o feminino
>
>

> \def\prof#1#2{Prof�. #1}
>
> \prof{Paula}
>
> Prof�. Paula

Isso vai imprimir sempre Prof�, qualquer que seja o primeiro argumento.
> ou at� mesmo esta, (que eu acho que seria a correta para definir o


> comando)
>
> \def\prof[#1]#2{Prof$^#1$}. #2}
>
> \prof[a]{Paula}
>

> Prof�. Paula

Tem um } sobrando ali. Al�m disso, h� alguns problemas:

- Se o argumento tiver mais de uma letra, s� a primeira vai ficar
elevada. #1 teria que estar entre chaves.
- N�o use o modo matem�tico para gerar os sobrescritos, a fonte fica
errada. \mathrm ou \text podem ajudar, mas o melhor � usar
\textsuperscript e ignorar completamente o modo matem�tico.
- Melhor usar ~ ao inv�s do espa�o para separar o t�tulo do nome para
evitar uma quebra de linha.

> resumindo, heheheheh
> queria saber como criar o comando com os seguintes resultados
>
>
> \prof{Luiz Gustavo}
>
> Prof. Luiz Gustavo
>
>
> \prof[a]{Paula}
>

> Prof�. Paula

Para criar comandos com um argumento opcional, usa-se a sintaxe

\newcommand{\command}[n][opt]{definicao}

n � o n�mero de argumentos (contando o opcional), e opt � o valor
atribu�do ao primeiro caso ele n�o seja informado. Podemos fazer algo como

\newcommand{\prof}[2][]{definicao}

Ou seja, se n�o informado, #1 fica vazio. Mas precisamos ent�o de uma
maneira de verificar se o argumento foi ou n�o informado para n�o gerar
um sobrescrito quando ele n�o foi informado. A maneira mais leg�vel �

\usepackage{ifthen}

\newcommand{\prof}[2][]{%
\ifthenelse{\equal{#1}{}}%
{Prof.~#2}%
{Prof\textsuperscript{#1}.~#2}%
}


--
You are in the hall of the mountain king.

Eduardo M KALINOWSKI
edu...@kalinowski.com.br

Luiz Gustavo Rodrigues de Oliveira

unread,
Feb 9, 2012, 2:04:06 PM2/9/12
to late...@googlegroups.com
Muito Obrigado Fernando

você aonde posso encontrar material (de preferência em português, aff) sobre comando internos, if, def, gdef, etc?

é que estou montando uma .sty para trabalhos academicos da minha faculdade, como TCC.


agora voltando a usa ajuda, eu testei ela, mas não era bem o que eu queria
heheheh
mas consegui sim descobrir com oque se faz, olhando no código fonte de outros arquivos (como é bom a vida de software livre, além de não pagar nada, ainda da para estudar como ele funciona que é uma beleza)

chegando de enrolação, não precisei usar o pacote ifthen. Es o código para criar comando com comandos opcionais, mas ainda não descobrir como faze-lo usando o \def, se alguem poder ajudar depois. =D


\newcommand{\prof}[2][]{Prof$^{#1}$. #2}


\begin{document}

\prof[a]{Paula}

\prof{Luiz Gustavo}


\end{document}



1 - O que eu testei e fui percebendo, que somente o primeiro comando pode ser opcional

2 -  para definir o valor um comando opcional padrão é colocado no []

      Ex:

              \newcommand{\prof}[2][]{Prof$^{#1}$. #2} 

% o segundo "[]" esta em branco, então o valor padrão dele é nulo

               \newcommand{\prof}[2][aaaaaaaaaaaaa]{Prof$^{#1}$. #2}


% o segundo "[]" esta em branco, então o valor padrão dele é "aaaaaaaaaaaaa"


3 - e por ultimo e mais imporante, você é obrigado a colocar o primeiro parametro ( #1
) entre colchetes {#1}


Muito obrigado pela ajuda, e por eu também já poder contribuir


Abraços a todos
--
Antes de imprimir, pense em sua responsabilidade e compromisso com o Meio Ambiente

Luiz Gustavo Rodrigues de Oliveira

unread,
Feb 9, 2012, 2:12:14 PM2/9/12
to late...@googlegroups.com
Eduardo, esta postando quando você me mandou o seu e-mail, mas muito obrigado pela dica do "~" tenho certeza que vai ser útil aqui, e eu estava demorando a escrever o e-mail, pois estava procurando justmente este comando "\textsuperscript" (que não sabia o nome, mas já tinha visto ele uma vez) para deixa-lo em uma só linha, segue o comando final. =D Valeu galera


\newcommand{\prof}[2][]{Prof\texsuperscript{#1}.~#2}


Abraços.
OBS: alquem ai é de Brasilia?
È que gostaria de saber se tem curso de Latex por aqui, ou ter gente para me ajudar a estudar também, heheheheh

Eduardo M KALINOWSKI

unread,
Feb 9, 2012, 2:15:50 PM2/9/12
to late...@googlegroups.com
On 02/09/2012 05:12 PM, Luiz Gustavo Rodrigues de Oliveira wrote:
> Eduardo, esta postando quando voc� me mandou o seu e-mail, mas muito
> obrigado pela dica do "~" tenho certeza que vai ser �til aqui, e eu

> estava demorando a escrever o e-mail, pois estava procurando justmente
> este comando "\textsuperscript" (que n�o sabia o nome, mas j� tinha
> visto ele uma vez) para deixa-lo em uma s� linha, segue o comando

> final. =D Valeu galera
>
>
> \newcommand{\prof}[2][]{Prof\texsuperscript{#1}.~#2}
>

Voc� precisa verificar se o argumento � vazio e n�o usar
\textsuperscript se n�o tiver nada. Coloque num documento e veja a
diferen�a:

Prof\textsuperscript{}. aaaa

Prof. aaa


--
Most people can't understand how others can blow their noses differently
than they do.
-- Turgenev

Eduardo M KALINOWSKI
edu...@kalinowski.com.br

Renato

unread,
Feb 9, 2012, 2:45:19 PM2/9/12
to late...@googlegroups.com
Para fazer o a da prof pode-se usar o \textordfeminine (também existe
o \textordmasculine) só não sei em qual pacote eles estão, talvez seja
no próprio LaTeX.

Renato

2012/2/9 Eduardo M KALINOWSKI <edu...@kalinowski.com.br>:


> On 02/09/2012 05:12 PM, Luiz Gustavo Rodrigues de Oliveira wrote:

>> Eduardo, esta postando quando você me mandou o seu e-mail, mas muito
>> obrigado pela dica do "~" tenho certeza que vai ser útil aqui, e eu


>> estava demorando a escrever o e-mail, pois estava procurando justmente

>> este comando "\textsuperscript" (que não sabia o nome, mas já tinha
>> visto ele uma vez) para deixa-lo em uma só linha, segue o comando


>> final. =D Valeu galera
>>
>>
>> \newcommand{\prof}[2][]{Prof\texsuperscript{#1}.~#2}
>>
>

> Você precisa verificar se o argumento é vazio e não usar
> \textsuperscript se não tiver nada. Coloque num documento e veja a
> diferença:

Reply all
Reply to author
Forward
0 new messages