
Não é a primeira vez que tento criar um novo comando sem sucesso. Algumas coisas que descobri não funcionaram (obtendo "sequência de controle indefinida" ou outros erros).
Use um argumento quote-endquote.
\newcommand{\mytest}[1]{ \quote #1 \endquote }
Use o
\verb
comando com o argumento\newcommand{\mytest}[1]{ \verb+#1+ }
Utilize o
begin{lstlisting}
ambiente:\newcommand{\mytest}[1]{ \begin{lstlisting} #1 \end{lstlisting} }
Você sabe onde posso encontrar uma lista exaustiva do que posso \newcommand
e do que não posso fazer? e melhor ainda, por quê?
Responder1
É muito difícil dizer o que você pode fazer com a \newcommand
, porque as possibilidades são (realmente) infinitas.
Posso falar dos seus dois exemplos, apontando os erros que você está cometendo.
Na primeira definição você usa \quote
e \endquote
e isso é um erro; \quote
é o comando que o LaTeX executa quando encontra \begin{quote}
, mas isso acontecedepois que um grupo é abertocomo efeito colateral de \begin
. O grupo normalmente é fechado por \end
quando o LaTeX encontra \end{quote}
desfazendo automaticamente as configurações dos parâmetros realizadas por \quote
.
Com a sua definição, depois \mytest{something}
você descobrirá que a largura da linha éalterado permanentementee o recuo esquerdo durará para sempre. Em vez disso, é seguro dizer
\newenvironment{myenv}{\quote}{\endquote}
porque o agrupamento será fornecido por \begin{myenv}
e \end{myenv}
.
Qual é a principal característica do \newcommand
? Vejamos um exemplo simples:
\newcommand{\foo}[1]{?#1!}
Agora, se você digitar \foo{xyz}
, é exatamente o mesmo que digitar
?xyz!
porque quando o TeX faz a varredura, \foo
ele sabe que precisa encontrar um argumento (o primeiro token após \foo
se não for {
ou toda a lista de tokens até o correspondente }
) e substituí-lo \foo<argument>
pelo texto de substituição especificado na \newcommand
instrução, onde <argument>
é denotado por #1
.
Você pode ter até nove argumentos (até mesmo nenhum). Tudo o que se faz é essa “substituição”. Com definições adequadas, juntamente com estruturas condicionais, você pode até definir macros recursivas, mas seria muito longo para descrever. A maior parte das “definições do usuário” são apenas substituições simples (ou moderadamente complexas) para marcação de unidades lógicas.
O TeX não verifica o que vem depois de um comando até que eletempara. Portanto, ao fazer isso \foo
, ele não ultrapassará o argumento e não expandirá nenhuma macro dentro do argumento até que a substituição da macro termine. Então depois
\foo{\baz{x}}
TeX verá
?\baz{x}!
depois disso, ele será processado primeiro ?
e depois \baz{x}
como se estivessem na entrada desde o início, mas com uma pequena diferença que aparece no seu segundo exemplo.
A diferença na digitação \foo{\baz{x}}
é ?\baz{x}!
que o TeX já terátokenizado \baz{x}
.
O \verb
comando funciona alterando o significado de todos os caracteres especiais. Fá-lo atrasando até possível a absorção do texto a ser digitado literalmente e isso acontecerá em grupo; então
\verb+\baz{x}+
fará os seguintes passos
- Abra um grupo (fornecendo
{
) - Comece a composição na fonte monoespaçada
- Altere o significado de todos os caracteres especiais para “imprimível”
- Defina
+
para se comportar como}
(o token de fechamento do grupo) - Continue compondo tudo o que encontrar
- O rastreamento
+
irá desfazer todas as configurações especiais
A descrição não está completa, mas é suficiente para nossos propósitos; existem outros detalhes técnicos que são irrelevantes para a compreensão do quadro geral.
O que acontece quando você define
\newcommand{\foo}[1]{\verb+#1+}
como você propõe? Quando o TeX vê\foo{\baz{x}}
o vê, sabe que precisa procurar um argumento e tokenizá-lo. Portanto o argumento équatro fichas(Eu os separo por •)
\baz • { • x • }
e nenhuma mudança no significado de \
e {
pode }
mais ser executada. Pior ainda, o +
que deveria mudar de significado para se tornar o token de fechamento do grupo não pode ser modificado, pois já foi tokenizado no momento da definição. Portanto o LaTeX possui um mecanismo de proteção que não permite \verb
estar no argumento de um comando, pois qualquer tipo de mal poderia acontecer se você usá-lo em tal lugar: mudar o significado dos caracteres especiais sem ter a possibilidade de desfazer a configuração colocaria você em um canto sem qualquer fuga.
Existem soluções alternativas? Sim, vejaComo colocar o comando \verb dentro do bloco \textbf{}?, mas antes de tudo pergunte a si mesmo se você realmente precisa literalmente do argumento de um comando para começar.