使用 Lua 格式化章节标题

使用 Lua 格式化章节标题

我正在尝试lecture从基础section环境创建一个新的环境。

Lecture <number>: <title>如果提供了标题,我希望它的标题为,Lecture <number>如果没有提供,我希望它的标题为。这个标题也应该在左页脚中报告。

这是我目前拥有的代码:

\definehead
  [lecture]
  [section]

\setuphead
  [lecture]
  [
    command=\Lecture,
    style=\bfc,
  ]

\setuplabeltext
  [lecture={Lecture}]

\define[2]\Lecture{\ctxlua{
  userdata.format_lecture_title({
    label = context.labeltext('lecture'),
    number = [==[#1]==],
    title = [==[#2]==],
  })
}}

\setupfootertexts
  [\ctxlua{
    userdata.format_lecture_title({
      label = context.labeltext('lecture'),
      number = context.getmarking({'lecturenumber'}),
      title = context.getmarking({'lecture'}),
    })
  }]
  [pagenumber]

\startluacode
  userdata = userdata or {}

  function userdata.format_lecture_title(args)
    if args.title and args.title ~= '' then
      context('%s %s: %s', args.label, args.number, args.title)
    else
      context('%s %s', args.label, args.number)
    end
  end
\stopluacode

\starttext

% Both title and left footer should be 'Lecture 1: Foo'
\startlecture [title={Foo}]
Foo bar baz
\stoplecture

\page

% Both title and left footer should be 'Lecture 2'
\startlecture []
Foo bar baz
\stoplecture

\stoptext

不幸的是,正文中的标题和页脚中的标题都没有正确报告。前者的格式很简单,如下所示Lecture

在此处输入图片描述

而后者的格式如下Lecture<number><title>

在此处输入图片描述

我究竟做错了什么?

答案1

以下内容可能会有所改进,但似乎可以满足您的需要:

\definehead
  [lecture]
  [section]

\setuplabeltext[lecture=Lecture~]

\setuphead
  [lecture]
  [placehead=yes, bodypartlabel=lecture, command=\Lecture]

\define[2]\Lecture{%
  \doiftextelse{#2}{#1: #2}{#1}
}

\define\LectureFooter{%
  \doiftextelse
    {\headtextcontent}
    {\headnumbercontent: \headtextcontent}
    {\headnumbercontent}
}

\setupfootertexts
  [\LectureFooter]
  [pagenumber]


\starttext

% Both title and left footer should be 'Lecture 1: Foo'
\startlecture [title={Foo}]
Foo bar baz
\stoplecture

\page

% Both title and left footer should be 'Lecture 2'
\startlecture []
Foo bar baz
\stoplecture

\stoptext

至于这是如何工作的......Lecture标题中的部分直接来自 Wiki 部分\setupheadhttps://www.contextgarden.net/Command/setuphead),特别是“设置部件标签”部分。然后我\setuplabeltext直接查找(https://wiki.contextgarden.net/Command/_setuplabeltextcommand) 并找到了选项的实际工作原理示例setuphead。第一个参数是编号,第二个参数是您的章节的标题。这意味着您所需要的只是一个简单的 if 语句,无需 Lua 即可完成。

由于您的 Lua 代码正在运行,因此我随后inspect查看了您的 args 表的内容。结果发现它并没有发送讲座名称的直接值,而是上下文命令\headnumbercontent\headtextcontent,我将其取出并直接用于页脚。这也解释了为什么您的讲座 1 显示在讲座 2 下。发布\headtextcontent时还没有改变……您可以通过在代码中更改为来command查看效果。commandbefore

相关内容