在 Microsoft Word 中,有两种方式显示公式;排队和展示。内联方程式与文本对齐(顾名思义),因此方程式和文本可以混合。显示方程式出现在其自己的行上并自动居中,如下所示:
这是三个独立的方程,但由于它们被设置为显示模式,所以它们都居中显示,并位于各自的行上。如果将它们的模式更改为内联,它们都会显示在同一行上,而不是居中显示:
我的问题是,LibreOffice 使用内联模式显示所有方程式,即使在 docx 文件中将它们设置为显示模式。如果我使用显示模式方程式 Word 创建第一个示例,保存它,然后在 LibreOffice 中打开它,则方程式看起来就像是内联模式:
是否有可以更改的设置,使显示模式方程式像在 Word 中一样位于各自的行上并居中?由于我拥有的 Word 文档数量庞大,我宁愿不单独修改文档。
如果没有,是否有其他文字处理器可以正确显示方程式?
答案1
当在 LibreOffice 中插入公式时,它会As Character
默认被固定。
这意味着它的行为与字符相同。因此,我们将其视为三个字符,例如“abc”,而不是三个方程式。
- 格式 -> 对齐 -> 居中
- 将光标移到第一个方程式后并按Enter。
- 对第二个方程重复步骤 2。
现在,所有三个方程都位于中心且位于不同的行上。
以下是针对“abc”示例的这些说明的结果,表明公式的行为与字符相同。(按Enter自动更正为大写“A”)。
为了使此功能在 MS Word 和 LibreOffice 中均可用,也许可以使用排队仅限设置。但是,我没有 MS Word 副本来验证这一点,并且 Word Online 无法编辑公式(但如果这就是您所需要的,则可以显示它们)。
是否有其他文字处理器可以使用展示像 MS Word 那样设置公式?很有可能;有许多替代方案,有付费的,也有免费的。但无论你选择哪种替代方案,都会存在某种不兼容性。
答案2
我承认,Linux 上不太可能有具有此功能的文字处理器,因此我决定通过创建 Ruby 脚本来自动执行 Jim K 的回答。
问题的根源在于 LibreOffice 忽略了m:oMathPara
XML 元素,而 Word 也将显示模式方程式包装在其中以使其居中并放在自己的段落中。
下面的 Ruby 脚本使用 Nokogiri XML 解析库将所有出现的 替换为m:oMathPara
标准w:p
段落,这些段落也被格式化为居中对齐。它执行以下操作:
- 将 DOCX(指定为命令行参数)复制到
/tmp
,解压并打开document.xml
- 扫描 XML 中的
m:oMathPara
元素 w:p
用格式化元素替换它们- 将 DOCX 重新压缩为
/tmp
- 在 LibreOffice 中打开生成的 DOCX
- 询问用户是否要保留更改;如果回答是,则将转换后的 DOCX 复制到原始文件上以覆盖它
这还没有经过太多测试,所以你应该备份使用它的所有文件以防万一。请注意,它只适用于 Linux,并且需要unzip
安装该工具。(如果你没有它,它在 universe 上:sudo apt install unzip
。)你可能也需要gem install nokogiri
。
#!/usr/bin/ruby
# THIS IS LINUX ONLY!
# You'll also need to install `unzip`:
# sudo apt install unzip
require "pp"
require "zip"
require "fileutils"
require "nokogiri"
def error(msg)
puts msg
exit
end
temp_dir = "/tmp/dispeqfix/"
filename = ARGV[0]
error "Please pass a filename as an argument." if filename.nil?
# Remove the directory if this tool has been run before
FileUtils.remove_dir(temp_dir) if Dir.exist? temp_dir
# Extract file as a zip
%x{unzip '#{filename}' -d '#{temp_dir}'}
# Get path to document.xml, the file we need to modify
document_path = "/tmp/dispeqfix/word/document.xml"
error "document.xml not found - are you sure this file is a DOCX?" unless File.exist? document_path
xml = Nokogiri::XML(File.read(document_path))
# 'm:oMathPara' is the element which LibreOffice doesn't support
xml.search("//m:oMathPara").each do |math_para|
# Get the paragraph containing this one
parent_para = math_para.parent
# Get the 'm:oMath' contained within the 'm:oMathPara'
math_para.dup.children.each do |math|
# Insert a new paragraph with contains the 'm:oMath'
new_para = Nokogiri::XML::Node.new("w:p", xml)
math.parent = new_para
parent_para.after(new_para)
# Centre the paragraph
math.before("<w:pPr><w:jc w:val=\"center\"/><w:rPr/></w:pPr><w:r><w:rPr/></w:r>")
end
math_para.remove
end
# Write this temporary file
File.write(document_path, xml.to_xml)
# Re-zip and open it
%x{ cd /tmp/dispeqfix; zip -r ../dispeqfix.docx * }
preview = spawn("libreoffice --writer /tmp/dispeqfix.docx 2>&1 > /dev/null", out: File::NULL)
Process.detach(preview)
# Prompt for overwrite
print "Would you like to overwrite the original document with this one? [y/n] "
if $stdin.gets.chomp == "y"
%x{ cp -f /tmp/dispeqfix.docx #{filename} }
puts "Overwritten."
else
puts "No change made."
end