Novo comando: O que não pode ser feito?

Novo comando: O que não pode ser feito?

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 \verbcomando 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 \newcommande 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 \quotee \endquotee 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 \endquando 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, \fooele sabe que precisa encontrar um argumento (o primeiro token após \foose não for {ou toda a lista de tokens até o correspondente }) e substituí-lo \foo<argument>pelo texto de substituição especificado na \newcommandinstruçã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 \verbcomando 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

  1. Abra um grupo (fornecendo {)
  2. Comece a composição na fonte monoespaçada
  3. Altere o significado de todos os caracteres especiais para “imprimível”
  4. Defina +para se comportar como }(o token de fechamento do grupo)
  5. Continue compondo tudo o que encontrar
  6. 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 \verbestar 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.

informação relacionada