Como escrever [0,1) no modo LaTeX sem interromper o recuo?

9

Ao escrever o LaTeX usando latex-mode, geralmente quero escrever "intervalos semiabertos" no meu texto. Por exemplo [0,1),, que se refere ao conjunto de todos os números xcom 0 <= x < 1.

Infelizmente, esses "delimitadores desequilibrados" parecem confundir o analisador de indentação, fazendo com que o texto a seguir seja indentado de maneira inadequada, geralmente à direita.

Aqui está um exemplo de documento. O texto abaixo é o resultado depois de fazer C-x h M-x indent-region. O comportamento correto seria ter todos os parágrafos recuados por 0 espaços.

\documentclass{article}
\begin{document}

Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nam volutpat
at dui et mattis. Here is a half open interval $[0,1)$.  Proin
  fringilla lectus nec mi tincidunt aliquet. Vestibulum fermentum eu
  neque id egestas. Here is another $[1,2)$.  Nullam et lectus
    convallis, placerat neque non, vehicula nisi.  Fusce imperdiet
    dignissim ante, eget fringilla nisi.

    Integer fermentum nunc eget purus molestie commodo. Integer
    tristique tincidunt odio, vel rutrum diam commodo quis. Fusce a
    aliquet quam. Cras suscipit est et nisl sollicitudin
    iaculis. Aliquam erat volutpat. Phasellus sapien arcu, aliquet ut
    hendrerit in, lobortis nec ante.

\end{document}

Atualmente, estou trabalhando nisso com um truque feio: defino uma macro LaTeX que não se expande e escrevo os delimitadores "correspondentes" dentro de uma invocação dessa macro. Isso faz o indentador voltar a sincronizar.

\documentclass{article}
\newcommand{\ugh}[1]{}
\begin{document}
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nam volutpat
at dui et mattis. Here is a half open interval $[0,1)$.  Proin
  fringilla lectus nec mi tincidunt aliquet. Vestibulum fermentum eu
  neque id egestas. \ugh{(]} Now on the next line we are back in sync.
Nullam et lectus convallis, placerat neque non, vehicula nisi.  Fusce
imperdiet dignissim ante, eget fringilla nisi.
\end{document}

Mas isso é realmente desagradável. Existe uma solução melhor?

Estou usando o GNU Emacs 24.4.1.

Nate Eldredge
fonte
3
Não respondeu à sua pergunta, mas você já pensou em experimentar o AUCTeX? Não sofre deste pequeno inseto, por exemplo.
Giordano
@giordano: Eu olhei para isso. Seu comportamento padrão é muito mais pesado do que o que eu quero. Prefiro editar o LaTeX como código e não quero renderização no editor no estilo WYSIWYG. Talvez seja possível desativar tudo isso e ter uma experiência com o editor de texto, mas isso ainda faz o AUCTeX parecer um exagero.
Nate Eldredge
6
A que comportamento semelhante ao WYSIWYG você está se referindo? Somente esses recursos são de visualização e modo de dobra e nenhum deles está ativo por padrão (você nem precisa carregar os pacotes correspondentes para usar o AUCTeX). A principal diferença entre os modos AUCTeX e vanilla * TeX é um mecanismo de preenchimento automático muito superior ao inserir macros e ambientes. Se você valoriza o preenchimento automático, o AUCTeX é o caminho a seguir. Além disso, no AUCTeX você sempre precisa editar o código * TeX, não há outras possibilidades, não sei por que você teve essa impressão errada.
Giordano

Respostas:

7

Não é uma solução Emacs, mas meu código LaTeX grava intervalos como \halfopen{0}{1}, onde

\newcommand\halfopen[2]{\ensuremath{[#1,#2)}}

Esta convenção leva o problema de balanceamento para um local onde é improvável que cause problemas. E é pesquisável :-)

Norman Ramsey
fonte
2
Para que você usa (0,1]?
Andrew Swann
@ andrew-swann Talvez \openhalfhehehe
Dox
@AndrewSwann\halfclosed
Norman Ramsey
2

A função latex-indentde indentação de latex-modedefine a tabela de sintaxe para tex-latex-indent-syntax-tablee chama, latex-find-indentque por sua vez chama latex-backward-sexp-1.

A sintaxe de ?\(e ?\)é configurada para o "."que significa "pontuação". Portanto, não é mais um delimitador.

Portanto, expressões como [0,1)resultado em um scan-errorem latex-backward-sexp-1que leva ao comportamento inesperado.

Você pode evitar isso adicionando o seguinte ao seu arquivo init:

(eval-after-load "tex-mode"
    '(progn (modify-syntax-entry ?\( "()" tex-latex-indent-syntax-table)
             (modify-syntax-entry ?\) ")(" tex-latex-indent-syntax-table)))

Mas não conheço as consequências negativas dessa configuração desde que uso auctex. Então, espere o pior ;-).

Tobias
fonte