ConTeXt:防止不同類型的浮動物件中的參考名稱衝突

ConTeXt:防止不同類型的浮動物件中的參考名稱衝突

我發現 ConTeXt 使用相同的命名空間來引用浮動物件非常煩人。換句話說,如果您對圖形和表格給出相同的引用,那麼您將始終引用最先定義的那個,即明顯的名稱衝突。從我的角度來看,這是愚蠢的。在 ConTeXt Wiki 上,我看到了類似的解決方法\figure[figure:Your Reference],即他們建議在所有參考文獻中添加垃圾郵件figure:table:前綴,我再次覺得這很煩人。

這是我想做的:

\let\corefigure\figure

\def
\figure{
  \dosingleargument
  \dofigure
}

\def
\dofigure[#1]{
  \corefigure[figure:#1]
}

\let\corestartplacefigure\startplacefigure

\def
\startplacefigure{
  \dotripleargument
  \dostartplacefigure
}

\def
\dostartplacefigure[#1][#2][#3]{
  # TODO: Somehow insert "figure:" into #1 after "reference="...
  \corestartplacefigure[#1][#2][#3]
}

桌子也是如此。那麼如何巧妙地完成這TODO件事呢?

尋找建議和澄清。謝謝。

答案1

referenceprefix您可以使用命令的鍵為每個浮點類型設定前綴\setupcation

\setupexternalfigures[location=default]

\setupcaption[figure][referenceprefix=figure]
\setupcaption[table] [referenceprefix=table]

\starttext

\dorecurse{3}{\input knuth\par}

\startplacefigure[title=Test figure,reference=test]
  \externalfigure[cow][width=4cm]
\stopplacefigure

\dorecurse{3}{\input zapf\par}

\startplacetable[title=Test table,reference=test]
  \starttabulate[|l|l|]
  \HL
  \NC One \NC Two \NC\NR
  \NC Three \NC Four \NC\NR
  \HL
  \stoptabulate
\stopplacetable

\dorecurse{3}{\input tufte\par}

\page

This documents contains a figure on \at{page}[figure:test] and a table on \at{page}[table:test].

\stoptext

答案2

\let\figure\corefigure

\def
\figure{

定義了\figure兩次,放棄第一個定義\corefigure,我懷疑您打算\let在另一個方向保存現有的定義\figure

 \let\corefigure\figure

答案3

雖然Metafox的回答提供了很好的提示referenceprefix,但這仍然只是解決方案的一半。在這裡,我想提供完整可靠的解決方案並進行解釋,因為在我將它們拼湊在一起之前存在一些令人討厭的陷阱。我將給出圖形、表格和公式的解決方案,其他浮動物件將遵循相同的方案。我相信有些人會發現它很有用。

PS 上帝保佑你們,苦澀的人,你們否決了我的問題。

解決方案


因此,首先要定義的是標題:

\setupcaption
[figure][
            style={small},
        headstyle={bold},
            width={\textwidth},
            align={middle},
         location={bottom},
              way={bysection},
           prefix={yes},
   prefixsegments={chapter:section},
  referenceprefix={figure},
]

\setupcaption
[table][
            style={small},
        headstyle={bold},
            width={\textwidth},
            align={right},
         location={top},
              way={bysection},
           prefix={yes},
   prefixsegments={chapter:section},
  referenceprefix={table},
]

\setupformulas[
      numberstyle={bold},
              way={bysection},
           prefix={yes},
   prefixsegments={chapter:section},
  referenceprefix={formula},
]

有很多設置,但列出它們只是為了完整起見。我們討論的重要內容是referenceprefix。接下來,我們定義參考格式:

\definereferenceformat
[infigure]

\definereferenceformat
[intable]

\definereferenceformat
[informula][
   left={(},
  right={)},
]

請注意,我給它們都添加了前綴in。這很重要,因為實際上上面的指令已經定義了新的巨集:\infigure[...], \intable[...], \informula[...]。這些將是我們的輔助宏,我們不會直接在文本中使用它們!

最後,我們用友善的名稱定義自訂巨集:\figure[...]、、、\table[...]\formula[...]

\def
\figure{
  \dosingleargument
  \dofigure
}

\def
\dofigure[#1]{%
  \leavevmode
  \unskip
  \infigure
  [figure:#1]
  \ignorespaces
  \unskip
}

\def
\table{
  \dosingleargument
  \dotable
}

\def
\dotable[#1]{%
  \leavevmode
  \unskip
  \intable
  [table:#1]
  \ignorespaces
  \unskip
}

\def
\formula{
  \dosingleargument
  \doformula
}

\def
\doformula[#1]{%
  \leavevmode
  \unskip
  \informula
  [formula:#1]
  \ignorespaces
  \unskip
}

我們完了。現在,您可以在文字中安全地使用\figure[...]\table[...]、 和 ,而不必擔心不同類型的浮動物件之間的命名衝突。\formula[...]如果您想了解陷阱及其解決方法,請繼續閱讀。

陷阱


首先,注意 and 兄弟後面的百分號 ( %) \dofigure[#1]{。這可以防止引用前面出現額外的寄生空間。試著刪除它,你就會明白我在說什麼。

其次,注意\infigure[figure:#1]and brothers 是如何被包裝成

\leavevmode
\unskip
...
\ignorespaces
\unskip

您可以嘗試忽略它們,看看自己會發生什麼。您應該注意到所有引用周圍都有奇怪的間距:更具體地說,引用周圍似乎添加了 2 個額外的寄生蟲空間。這是我在純宏上註意到的問題,\in[...]無論它在哪裡使用,以及用\definereferenceformat(如我們的輔助宏\infigure[...], \intable[...], )定義的宏,只有當它們在其他宏(如我們的, , 和\informula[...])中擴展時才出現。\figure[...]\table[...]\formula[...]

你可以說,“好吧,為什麼不嘗試傳統的方式:”

\def
\dofigure[#1]{%
  \infigure[figure:#1]%
}

答案是,它只會阻止右側的寄生空間,但左側的額外寄生空間仍然會保留。因此,將輔助巨集包含在上述構造中以保持正確排版的參考周圍的間距非常重要。

相關內容