背景

背景

背景

希望重现以下文本布局(忽略文本的轻微曲线,它是罗伯特·弗罗斯特的杂志扫描冰与火,首次出版于 1920 年):

火与冰,罗伯特·弗罗斯特

第一个字母很华丽,第一个单词全部大写。

问题

使用\definefirstline将第一个单词设置为大写字母的替代样式被证明是难以实现的。我怀疑实现不完整,因为更改样式以使用不同的颜色或字体是可行的。

代码

以下是目前的样式代码(main.tex):

\setupindenting[yes, 0.75em]

\setupinitial[
  state=start,
  n=2,
  distance=\zeropoint,
]

\definealternativestyle[PoemFirstWord][\WORD][]

\definefirstline[PoemFirstLine][
  alternative=word,
  style=PoemFirstWord,
  n=1,
]

\definestartstop[poem][
  before={\startlines \setfirstline[PoemFirstLine] \placeinitial},
  after={\stoplines},
]

\setuplines[indenting=odd]

\starttext
  \input poem.tex
\stoptext

这是poem.tex文件:

\startpoem

Some say the world will end in fire,
Some say in ice.
From what I've tasted of desire
I hold with those who favor fire.
But if it had to perish twice,
I think I know enough of hate
To say that for destruction ice
Is also great,
And would suffice.

\stoppoem

输出

运行代码产生结果:

上下文输出

PoemFirstWord“Some” 这个词不是全部大写的,尽管应该style与选项一起工作definefirstline

问题

  • 如何创建一种可\placeinitial\startlines自定义启动/停止宏配合使用的替代样式?
  • 奖金。您将如何缩进第二行以避免与首字母华丽的“S”重叠?(有没有类似的东西definesecondline?)
  • 奖金。如何避免缩进第三行?

约束

  • 该文件poem.tex无法修改(它是自动生成的)。
  • 无法使用字母模块因为它需要改变poem.tex

有关的

版本

$ context --version
mtx-context     | current version: 2019.12.06 19:45

答案1

从邮件列表中,以下几行将大写注册为字体功能,允许设置\definefirstline宏所呈现的文本样式:

\startluacode
  fonts.handlers.otf.addfeature {
    name    = "uppercasing",
    type    = "substitution",
    prepend = true,
    data    = characters.uccodes
  }
\stopluacode

\unexpanded\def\uppercasing{\feature[+]{uppercasing}}

将上述内容保存为uppercase.tex可以导入并使用的文件,如下所示:

\input uppercase

\setupinitial[n=2, distance=-2pt]

\definealternativestyle[poem:UppercaseFirst][{\tfa\bf\uppercasing}][]

\definefirstline[poem:FirstLine][%
  alternative=word,
  style=poem:UppercaseFirst,
  n=1,
]

\definestartstop[poem][
  before={\startlines \setfirstline[poem:FirstLine] \placeinitial},
  after={\stoplines},
]

\newcount\LineCount
\define\AdvanceLineCount{\global\advance\LineCount 1\relax}

\setuplines[
  before={\global\LineCount 0\relax},
  indenting=odd,
  command={%
    \AdvanceLineCount
    \ifnum\LineCount=2 \setupindenting[yes, 4em]\fi
    \ifnum\LineCount=3 \setupindenting[no]\fi
    \ifnum\LineCount=5 \setupindenting[yes, 0.75em]\fi
  },
]

\starttext
  \input poem
\stoptext

包括奖励问题在内,结果如下:

ConTeXt 中的火与冰

更多详细信息请参阅:

相关内容