vimの「gq}」コマンドで段落を折り返し、LaTeX

vimの「gq}」コマンドで段落を折り返し、LaTeX

このコマンドで のようなものをラップしないようにするにはどうすればよいですか\item?

例えば:

\begin{enumerate}
\item this might be a long paragraph that spans multiple lines 
\item blah
\end{enumerate}

最初の項目 (の最初の文字) にカーソルを置いて「gq}」を実行するとthis、次の出力が生成されます。

\begin{enumerate}
\item this might be a long 
paragraph that spans multiple 
lines \item blah \end{enumerate}

私が欲しいのはこれです:

\begin{enumerate}
\item this might be a long 
paragraph that spans multiple 
lines 
\item blah
\end{enumerate}

トークンが\item段落の終わりを意味することを vim に何らかの方法で認識させることができれば、正しく動作すると思います。しかし、どうすればいいのでしょうか?

答え1

'formatlistpat' オプションを設定して段落区切りタグを含めることで、これができると思います。これを機能させるには、'formatoptions' に 'n' を含める必要があります。

:help 'formatlistpat'
:help 'formatoptions'

例えば、

:set formatlistpat=^\\s*\\\\\\(end\\\\|item\\)\\>
:set formatoptions+=n
:set textwidth=40

例をフォーマットすると次のようになります:

\begin{列挙}
\item これは長い段落になるかもしれない
     複数行にまたがる
\item 何とか
\end{列挙}

最初の項目の 2 行目はタグの長さだけインデントされている\itemので、まさに希望どおりではありませんが、十分近いかもしれません。\zeヘルプに記載されているように、後続の行をインデントせずに Vim にタグを認識させることができるかどうか試してみることもできます。私はそれを試しませんでした。

アップデート

:let'formatlistpat' は、 の代わりにを使用して設定すると、少しわかりやすくなり、編集しやすくなります:set

:let &l:flp = '^\s*\\\(end\|item\)\>'

このl:部分は、バッファローカル設定であることを指定します。

アップデート

インデントを 1 文字に減らすには、次のようにします。

:let &l:flp = '^\s*\\\ze\(end\|item\)\>'

の前に空白がある場合、\itemインデントはその数 + 1 になることに注意してください。 を使用してインデントを 0 まで減らすことができるかどうかはわかりません\ze

答え2

これが私にとってはうまくいく解決策です。私はLaTeXテキストの書式設定を処理する外部スクリプトを書きました(https://github.com/elmanuelito/par-latex

vim での使用例:

  • テキストを選択してください(例: VjまたはggVG
  • 「:!par-latex」と入力します(vimのコマンドラインは次のようになります'<,'>!par-latex)。
  • 入力してください

デフォルトのオプションでは、itemize 環境内でテキストを選択した場合に例が処理されます。さらにテキストを選択した場合に機能するには、format_inside_groupスクリプトの先頭でオプションを有効にする必要があります。

関連情報