逐語ブロックの先頭にファントム文字を追加する方法

逐語ブロックの先頭にファントム文字を追加する方法

私は、commandcharsファンシー動詞の意味を理解しようとしていますVerbatim:

\documentclass{article}
\usepackage{fancyvrb}

\begin{document}
\phantom{foo}
\begin{Verbatim}[commandchars=\\\!\!]
\phantom{bar}
trait Sys[S <: Sys[S]] {
  type ID <: Ident[S#Tx]
  type Tx
}
\end{Verbatim}
\end{document}

これはbar}逐語録の最初の行に印刷されています。 3 つの質問があります。

  1. を使用すると、なぜこれが印刷されるのでしょうか\phantom
  2. 閉じ中括弧が含まれているのはなぜですか?
  3. commandchars=\\\{\}印刷されたプログラミング言語の中括弧と競合するため、 は使用できません。 そのため、 を使用します[commandchars=\\\!\!]。 ただし、 を挿入しようとすると、\phantom!bar!エラーが発生します\FancyVerbGetLine has an extra }

実際、私が実現したいのは、先頭の空行を印刷することだけですが、これは機能せず、代わりに半分の高さの行が表示されます。そこで、ファントム文字を追加して最初の行の高さを強制するのが最も簡単だと考えました。

答え1

エラーは

commandchars=\\\!\!

3つ指定する必要があります明確なの形式で\<char>、最初の文字はバックスラッシュの代わりに使用され、2番目は開き括弧の代わりに使用され、3番目は閉じ括弧の代わりに使用されます。したがって、

\documentclass{article}
\usepackage{fancyvrb}

\begin{document}

\begin{Verbatim}[commandchars=\\\!\?]
\phantom!bar?XYZ
trait Sys[S <: Sys[S]] {
  type ID <: Ident[S#Tx]
  type Tx
}
\end{Verbatim}

\end{document}

XYZファントムが尊重されていることを示すために追加しました。 1 行に 1 つだけ追加しても意味がありません。空白行を残してください。

ここに画像の説明を入力してください

例で何が起こるか見てみましょう。バックスラッシュは、Verbatimコマンドをエスケープするためにブロックでも機能するように定義されています。 は、!最初にグループを開くために と同等になり{、次にすぐにグループを閉じるために と同等になります}。したがって、左引数区切り文字がないため、マクロにマルチトークン引数を渡すことはできません。

が処理されると\phantom{bar}\phantomは通常どおり実行され (バックスラッシュに通常の意味が与えられます)、{左引数区切り文字が先行しないトークンが見つかります。逐語的モードであることに注意してください。したがって、{は の引数として取得され\phantom、文字に相当するスペースが生成されます。次に、bar}が逐語的に印刷されます。

あなたの試み

\phantom!bar!

は機能しません。なぜなら、 の外側では と等価になるためVerbatim\phantom}bar}これは違法です。

commandchars=\\\!\?

そして

\phantom!bar?

私たちは通常の状況では となることを行っています\phantom{bar}

答え2

多くの LaTeX コマンドには、コマンド文字のグループ ブロックの概念と互換性がないなどの問題があることがわかりました\phantom。回避策としては、次のように、パラメーターなしのヘルパー コマンドを定義することです。

\newcommand{\worstLanguageEver}{\phantom{I}}
\begin{Verbatim}[commandchars=\\\$\$]
\worstLanguageEver
trait Sys[S <: Sys[S]] {
  type ID <: Ident[S#Tx]
  type Tx
}

関連情報