背景
希望重现以下文本布局(忽略文本的轻微曲线,它是罗伯特·弗罗斯特的杂志扫描冰与火,首次出版于 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
包括奖励问题在内,结果如下:
更多详细信息请参阅: