如何向 Microsoft Word 添加新的引文和参考书目样式?

Rok*_*Rok 6 citations bibliography microsoft-word

在 Microsoft Word 中,有 12 种引文和参考书目样式可用,如以下屏幕截图所示:

Microsoft Word 中提供 12 种引文和参考书目样式。

然而,似乎没有一种简单的方法来添加自定义或新的引文和书目样式。不幸的是,我的大学使用自己独特的引文和参考书目风格,这是一种稍加修改的芝加哥风格。例如,基本上,他们使用&符号而不是“and”来指代两位作者。他们在参考书目中将年份放在作者之后,中间没有句点。

因此,我基本上需要向 Microsoft Word 添加新的引文和参考书目样式,它是芝加哥样式的副本,但有这两个细微的差别。

我对此的研究表明,这可以通过 XML 文件实现。我以前编辑过 XML 文件,但是芝加哥风格的 XML 文件在哪里?[编辑:路径似乎是%APPDATA%\Microsoft\Bibliography)

我需要改变芝加哥风格的哪些部分,以便将作者之间的“和”变成与号“&”,并删除参考书目中作者和年份之间的句点(它不会)不存在于内联引用中)?

APA 风格使用 & 符号,但不幸的是,其其余格式与 Chicago 显着不同,总体而言,Chicago 更接近我的目标风格。我尝试比较 APASixthEditionOfficeOnline.xsl 和 CHICAGO.XSL 文件,看看是否可以发现差异,从而为我需要更改的内容提供线索,因为 APA 使用&符号而 Chicago 使用“and”,但是不幸的是,我的 XML 知识水平以及这些文件的大小使我无法发现需要更改的部分。此外,两种风格都在参考书目中的作者后面添加了句号。

感谢您对此的任何帮助或提示。

小智 3

使用内置样式 .xsl 样式表很困难,因此以下只是一些建议。主要困难是确定更改的适当点 - 根据更改的内容,您可能能够进行单个更改,或者您可能必须进行许多相当相似的更改。这主要是因为这些样式表试图实现一组相当大的“小”规则。无论实现者如何这样做,总是很难确定更改样式表内的 XSL 模板将产生正确影响的点。使用不是特别熟悉的语言并且不提供内部文档也无济于事。

\n\n

另一个不幸的问题是,您可能必须将修改后的 .xsl 提供给需要处理您的文档的任何其他人。

\n\n

但例如,我建议您首先在您标识的文件夹中保存一份 Chicago.xsl 副本(您的用户区域中的文件夹,而不是 Program Files 或 Program Files (86) 下的文件夹)。将其命名为 Xhicago.xsl , 也许。

\n\n

然后,当您重新启动 Word 时,您应该会看到相关下拉列表中列出了两个相同的样式。现在在合适的编辑器中打开 .xsl(我目前在此处使用 Visual Studio Code,以及适用于 .xml 和其他文件类型的合适插件)。

\n\n

尽管如此,您至少可以尝试以下操作,因为它可以帮助您确定它是否足以满足您当前的需求。

\n\n

我建议您首先在您指定的文件夹中保存一份 Chicago.xsl 副本(您的用户区域中的文件夹,而不是 Program Files 或 Program Files (86) 下的文件夹)。也许可以将其称为 Xhicago.xsl。

\n\n

然后,当您重新启动 Word 时,您应该会看到相关下拉列表中列出了两个相同的样式。现在打开一个已经包含一些引文和参考书目的测试文档,并使用 Word 的下拉列表在两个芝加哥样式表之间切换。您应该看到输出没有任何变化,但 Word 可能会有点闪烁。

\n\n

在合适的编辑器中打开 Xhicago.xsl(我目前在此处使用 Visual Studio Code,以及适用于 .xml 和其他文件类型的合适插件)。

\n\n

IMO 首先要更改的是 XmlVersion,这样您就可以看到原始芝加哥版本和新版本之间的区别。搜索

\n\n
b:XmlVersion\n
Run Code Online (Sandbox Code Playgroud)\n\n

您应该看到这样的代码(如果您使用的是 Chicago.xsl 的明显不同版本,您可能会看到与我所看到的有所不同)。

\n\n
<xsl:when\xc2\xa0test="b:XslVersion">\n\n  <xsl:text>16</xsl:text>\n\n</xsl:when>\n
Run Code Online (Sandbox Code Playgroud)\n\n

将 16 更改为(例如)18(我认为 Microsoft 可能已经在我的版本之后继续前进),然后保存 .xsl。在这里,我通常不需要在测试更改时关闭它。就我个人而言,我还会写一条 XML 注释 - 除了其他任何事情之外,它确实可以帮助您找到您更改的内容。例如

\n\n
<xsl:when test="b:XslVersion">\n\n  <!-- 20200402 changed 16 to 18 -->\n\n  <xsl:text>18</xsl:text>\n\n</xsl:when>\n
Run Code Online (Sandbox Code Playgroud)\n\n

就我个人而言,我也更喜欢将旧代码包装在里面,以防万一我再次需要它。

\n\n

现在,再次重新启动 Word 并重新打开测试文档。您应该能够在下拉列表中看到两种不同的“芝加哥”样式,以及两个不同的版本号。

\n\n

接下来,在 .xsl 中查找

\n\n
  <xsl:template name="templ_str_AndUnCap" >\n
Run Code Online (Sandbox Code Playgroud)\n\n

你应该看到这样的一段代码:

\n\n
  <xsl:template name="templ_str_AndUnCap" >\n    <xsl:param name="LCID" />\n    <xsl:variable name="_LCID">\n      <xsl:call-template name="localLCID">\n        <xsl:with-param name="LCID" select="$LCID"/>\n      </xsl:call-template>\n    </xsl:variable>\n    <xsl:value-of select="/*/b:Locals/b:Local[@LCID=$_LCID]/b:Strings/b:AndUnCap"/>\n  </xsl:template>\n
Run Code Online (Sandbox Code Playgroud)\n\n

其作用是设置一个局部变量,其中包含 .xsl 在需要“and”时(至少在使用英语语言 ID 时)将使用的单词。

\n\n

每当 Word 想要生成引文或整个参考书目的文本时,它都会将 XML 文件传递​​到 .xsl。该文件包含所有相关引用,以及一大堆其他设置。其中一些是常规设置,例如“作者列表中最终作者之前是否应该有一个“和””,还有一些是与不同内置样式表相关的设置。此外,可以存在针对许多不同语言代码的设置。例如,对于英语,XML 可能包含“and”,但对于法语,XML 可能包含“et”。据我所知,没有地方可以让您配置这些设置 - 它们是硬编码在 Word 中的某处。

\n\n

因此,在更改此代码之前,您需要考虑可能会产生什么影响。

\n\n

首先,据我所知,“and”一词仅在传入 XML 中的一个元素中定义。因此,如果您想要“and”作为作者列表,而不是“Translators”列表,则不能依赖传入的 XML 来为您提供它。我建议的更改将在每个地方将“and”更改为“&”.xsl 引用此传入值的此外,它不会考虑任何语言 ID。但这是我建议的代码:

\n\n
<xsl:template name="templ_str_AndUnCap" >\n    <xsl:param name="LCID" />\n    <xsl:variable name="_LCID">\n      <xsl:call-template name="localLCID">\n        <xsl:with-param name="LCID" select="$LCID"/>\n      </xsl:call-template>\n    </xsl:variable>\n    <!--20200402 use &amp; instead of <xsl:value-of select="/*/b:Locals/b:Local[@LCID=$_LCID]/b:Strings/b:AndUnCap"/>-->\n    <xsl:text>&amp;</xsl:text>\n  </xsl:template>\n
Run Code Online (Sandbox Code Playgroud)\n\n

现在再次保存 .xsl。当您切换到芝加哥风格并返回 Xhicago 风格时,您应该会看到参考书目中反映的更改(尽管您可能需要更新参考书目)。如果您犯了任何编码错误,您很可能不会看到任何更改,事实上,下次重新启动 Word 时,您可能也不会在列表中看到 Xhicago 样式 - Word 将无法加载工作表,除非它是有效的 .xsl 并且具有 Word 所需的一些特殊模板。

\n\n

但是,如果一切正常并且您有一本由作者撰写的书

\n\n
Ionawr, Chwefror, Mawrth and Ebrill\n
Run Code Online (Sandbox Code Playgroud)\n\n

在芝加哥的引文中你应该看到

\n\n
Ionawr, Chwefror, Mawrth and Ebrill\n
Run Code Online (Sandbox Code Playgroud)\n\n

在参考书目中你应该看到

\n\n
Ionawr, Chwefror, Mawrth, and Ebrill\n
Run Code Online (Sandbox Code Playgroud)\n\n

在 希卡戈 你应该看到

\n\n
Ionawr, Chwefror, Mawrth & Ebrill\n
Run Code Online (Sandbox Code Playgroud)\n\n

\n\n
Ionawr, Chwefror, Mawrth, & Ebrill\n
Run Code Online (Sandbox Code Playgroud)\n\n

分别。

\n\n

现在我不太喜欢卢克后面的那个逗号,你可能可以通过寻找来摆脱它(同样,影响可能比你希望的更广泛)

\n\n
  <xsl:template name="templ_prop_NoCommaBeforeAnd" >\n
Run Code Online (Sandbox Code Playgroud)\n\n

并将文本更改为

\n\n
  <xsl:template name="templ_prop_NoCommaBeforeAnd" >\n    <xsl:param name="LCID" />\n    <xsl:variable name="_LCID">\n      <xsl:call-template name="localLCID">\n        <xsl:with-param name="LCID" select="$LCID"/>\n      </xsl:call-template>\n    </xsl:variable>\n    <!-- 20200402 hard code this one\n    <xsl:value-of select="/*/b:Locals/b:Local[@LCID=$_LCID]/b:General/b:NoCommaBeforeAnd"/>\n    -->\n    <xsl:text>yes</xsl:text>\n  </xsl:template>\n
Run Code Online (Sandbox Code Playgroud)\n\n

保存并测试它。

\n\n

最后,去掉作者和年份之间的点是有问题的,其原因比我们上面讨论的还要多。例如,它不一定是“年份前的点”。例如,如果没有一年怎么办?(我们甚至还没有讨论过用“等人”而不是实际作者姓名的情况)。

\n\n

对于书籍作者列表来说,可以解决这个问题的方法是搜索

\n\n
<xsl:variable name="theAuthorSufixDot">\n
Run Code Online (Sandbox Code Playgroud)\n\n

并将代码更改为

\n\n
<xsl:variable name="theAuthorSufixDot">\n  <!--this may be enough to suppress the dot between the authors and the year\n  <xsl:call-template name="appendField_Dot">\n    <xsl:with-param name="field" select="$theAuthorSufix"/>\n  </xsl:call-template>\n  -->\n  <xsl:value-of select="$theAuthorSufix" />\n</xsl:variable>\n
Run Code Online (Sandbox Code Playgroud)\n\n

顺便说一句,可能值得四处看看你的大学里是否有人。已经做了这项工作。我确实时不时地为人们做了一些小的修改,但我不认为在不花费大量时间在问题上的情况下,在所有情况下为所有“文化”做好准备确实一个实际的建议。\n尽管我认为 Word 传递给 XSL 的 XML 内部结构可能在 .docx 的 ISO 29500 标准中进行了描述,我发现整个区域非常混乱,并决定唯一有帮助的就是拥有一个迭代的样式表Word 提供的所有 XML。我确信它可以通过多种方式进行改进,但这是我的“explore.xsl”。显然,您不能像普通工作表一样使用它,但您可以将其放在与其他 .xsl 文件相同的文件夹中,并以 Word 中的常规方式切换到它。

\n\n

顺便说一句,Microsoft 关于需要在 .xsl 中放入什么内容的文档现在已经很旧了。我认为它不能很好地解释主要“选择”中的代码实现的一些“选项”,例如

\n\n
<xsl:when test="b:XslVersion">\n
Run Code Online (Sandbox Code Playgroud)\n\n

在早期版本的 Word 中需要,但在更高版本中不需要,反之亦然。此外,Mac 版本的 Word 一度支持与普通引文布局不同的脚注引文布局。然而,它在 Mac Word 2016 中消失了,我认为它不会再回来了。

\n\n

最后,您将在 Program Files(或 (86) 版本)下的 Microsoft Office 文件夹中找到参考书目系统使用的其他 .XSL 文件。据我所知,这些不用于生成引文和书目文本,仅用于 Word 使用的部分或全部与书目相关的对话框。

\n\n

但这是 explore.xsl:

\n\n\n\n

\n\n

urn:schemas-microsoft-com:xslt" \n   xmlns:b="http://schemas.openxmlformats.org/officeDocument/2006/bibliography" \n   xmlns:t="http://www.microsoft.com/temp">\n   <xsl:output method="html" encoding="utf-8"/>\n\n   <!--Match the root element, and dispatch to its children-->\n\n   <xsl:template match="/">\n      <!--<xsl:apply-templates select="*" />-->\n      <xsl:choose>\n         <xsl:when test="b:Version">\n            <xsl:text>2019.10.16</xsl:text>\n         </xsl:when>\n\n         <xsl:when test="b:XslVersion">\n            <xsl:text>2</xsl:text>\n         </xsl:when>\n\n\n\n         <xsl:when test="b:StyleNameLocalized">\n            <xsl:text>explore</xsl:text>\n         </xsl:when>\n\n      <!--<xsl:variable name="book_Title">\n         <xsl:value-of select="(b:Title)" />\n      </xsl:variable>-->\n\n         <xsl:when test="b:Citation">\n            <xsl:call-template name="output-data"/>\n         </xsl:when>\n\n         <xsl:when test="b:Bibliography">\n            <xsl:call-template name="output-data"/>\n         </xsl:when>\n\n      </xsl:choose>\n\n   </xsl:template>\n\n   <xsl:template name="output-data" >\n      <html xmlns="http://www.w3.org/TR/REC-html40">\n         <head>\n            <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>\n         </head>\n         <body>\n            <table>\n               <tr>\n                  <td>Name</td><td>Value</td>\n               </tr>\n               <xsl:apply-templates select="node()" />\n            </table>\n         </body>\n      </html>\n   </xsl:template>\n\n    <xsl:template match="node()"> \n      <xsl:if test="text()"> \n      <tr>\n         <td>\n         <!--From the Answer by Daniel Haley in \n            /sf/ask/66723821/ -->\n            <xsl:for-each select="ancestor-or-self::*">\n               <xsl:value-of select="concat(\'/\',local-name())"/>\n               <!--Predicate is only output when needed.-->\n               <xsl:if test="(preceding-sibling::*|following-sibling::*)[local-name()=local-name(current())]">\n                  <xsl:value-of select="concat(\'[\',count(preceding-sibling::*[local-name()=local-name(current())])+1,\']\')"/>\n               </xsl:if>\n            </xsl:for-each>\n         </td>\n         <td>\n            <xsl:value-of select="text()"/>\n         </td>\n      </tr>\n      </xsl:if>\n      <xsl:apply-templates select="@*"/>\n      <xsl:apply-templates select="node()"/>\n\n    </xsl:template>\n\n   <xsl:template match="@*">\n      <tr>\n         <td>\n            <xsl:text>@</xsl:text>\n            <xsl:value-of select="name(.)"/>\n         </td>\n         <td>\n            <xsl:value-of select="text()"/>\n         </td>\n      </tr>\n   </xsl:template>\n\n</xsl:stylesheet>\n
Run Code Online (Sandbox Code Playgroud)\n