LibreOffice 无法正确显示“显示”模式的文字方程式;有没有可以显示的 Linux 文字处理器?

LibreOffice 无法正确显示“显示”模式的文字方程式;有没有可以显示的 Linux 文字处理器?

在 Microsoft Word 中,有两种方式显示公式;排队展示。内联方程式与文本对齐(顾名思义),因此方程式和文本可以混合。显示方程式出现在其自己的行上并自动居中,如下所示:

在此处输入图片描述

这是三个独立的方程,但由于它们被设置为显示模式,所以它们都居中显示,并位于各自的行上。如果将它们的模式更改为内联,它们都会显示在同一行上,而不是居中显示:

在此处输入图片描述 在此处输入图片描述

我的问题是,LibreOffice 使用内联模式显示所有方程式,即使在 docx 文件中将它们设置为显示模式。如果我使用显示模式方程式 Word 创建第一个示例,保存它,然后在 LibreOffice 中打开它,则方程式看起来就像是内联模式:

在此处输入图片描述

是否有可以更改的设置,使显示模式方程式像在 Word 中一样位于各自的行上并居中?由于我拥有的 Word 文档数量庞大,我宁愿不单独修改文档。

如果没有,是否有其他文字处理器可以正确显示方程式?

答案1

当在 LibreOffice 中插入公式时,它会As Character默认被固定。

锚定角色

这意味着它的行为与字符相同。因此,我们将其视为三个字符,例如“abc”,而不是三个方程式。

  1. 格式 -> 对齐 -> 居中
  2. 将光标移到第一个方程式后并按Enter
  3. 对第二个方程重复步骤 2。

现在,所有三个方程都位于中心且位于不同的行上。

三个方程

以下是针对“abc”示例的这些说明的结果,表明公式的行为与字符相同。(按Enter自动更正为大写“A”)。

abc 单独放在一行

为了使此功能在 MS Word 和 LibreOffice 中均可用,也许可以使用排队仅限设置。但是,我没有 MS Word 副本来验证这一点,并且 Word Online 无法编辑公式(但如果这就是您所需要的,则可以显示它们)。

是否有其他文字处理器可以使用展示像 MS Word 那样设置公式?很有可能;有许多替代方案,有付费的,也有免费的。但无论你选择哪种替代方案,都会存在某种不兼容性。

答案2

我承认,Linux 上不太可能有具有此功能的文字处理器,因此我决定通过创建 Ruby 脚本来自动执行 Jim K 的回答。

问题的根源在于 LibreOffice 忽略了m:oMathParaXML 元素,而 Word 也将显示模式方程式包装在其中以使其居中并放在自己的段落中。

下面的 Ruby 脚本使用 Nokogiri XML 解析库将所有出现的 替换为m:oMathPara标准w:p段落,这些段落也被格式化为居中对齐。它执行以下操作:

  1. 将 DOCX(指定为命令行参数)复制到/tmp,解压并打开document.xml
  2. 扫描 XML 中的m:oMathPara元素
  3. w:p用格式化元素替换它们
  4. 将 DOCX 重新压缩为/tmp
  5. 在 LibreOffice 中打开生成的 DOCX
  6. 询问用户是否要保留更改;如果回答是,则将转换后的 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

相关内容