LibreOffice не показывает ''-режиму Дисплея уравнения Word правильно; существует ли текстовой процессор Linux, который может?

В Microsoft Word существует два способа отобразить уравнения; Встроенный и Дисплей. Встроенное уравнение соответствует тексту (как имя предполагает), так, чтобы уравнения и текст могли быть смешаны. Уравнение дисплея появляется на своей собственной строке и автоматически центрируется, как так:

enter image description here

Это три отдельных уравнения, но потому что они установлены на режим отображения, они все кажутся центрируемыми и на их собственной строке. Если их режим изменяется для встраивания, они все кажутся на той же строке и не центрируемыми вместо этого:

enter image description here enter image description here

Моя проблема состоит в том, что LibreOffice показывает все уравнения с помощью встроенного режима, даже если они установлены на режим отображения в docx файле. Если я создаю первый пример с помощью уравнений режима отображения Word, сохраняю его и затем открываю его в LibreOffice, уравнения появляются, как будто они - встроенный режим:

enter image description here

Существуют ли настройки, которые я могу изменить, чтобы заставить уравнения режима отображения быть на их собственных строках и центрируются, как они находятся в Word? Из-за чистого количества документов Word я имею, я не изменил бы документы индивидуально.

В противном случае существует ли альтернативный текстовой процессор, который отображает уравнения правильно?

3
задан 27 February 2018 в 20:09

2 ответа

Когда формула вставляется в LibreOffice, она привязывается As Character по умолчанию.

anchor as character

Это означает, что ведет себя то же, как символы делают. Таким образом, мы рассматриваем его тот же путь, как будто у нас было три символа, например, "abc" вместо трех уравнений.

  1. Формат-> Выравнивается-> Центр
  2. Переместите курсор после первого уравнения и нажмите Enter.
  3. Повторите шаг 2 для второго уравнения.

Теперь, все три уравнения центрируются и на отдельных строках.

three equations

Вот результат этих инструкций для примера "abc", показывая, что формулы ведут себя то же как символы. (Нажатие Enter, автоматически корректируемого к верхнему регистру).

a b c on separate lines

Для создания этой работы и в MS Word и в LibreOffice, возможно, используйте установку Inline только. Однако у меня нет копии MS Word для проверки этого, и Word Online не может отредактировать формулы (но может отобразить их, если это - все, в чем Вы нуждаетесь).

Существует ли альтернативный текстовой процессор, который использует формулу Дисплея, устанавливающую, как MS Word делает? Вполне возможно; существует много альтернатив, или заплаченных или свободных. Независимо от того, что альтернатива, которую Вы выбираете, тем не менее, будет несовместимостями некоторого вида.

4
ответ дан 1 December 2019 в 13:23

Я признал, что маловероятно, что существует Текстовой процессор с этой функциональностью для Linux, таким образом, я решил автоматизировать ответ K Jim путем создания сценария Ruby.

Источник проблемы - то, что LibreOffice игнорирует m:oMathPara Элемент XML, который является также что Переходы на новую строку уравнение режима отображения в центрировать его и поместить его в его собственный абзац.

Сценарий Ruby ниже пользуется библиотекой парсинга Nokogiri XML для замены всех происшествий m:oMathPara со стандартом w:p абзацы, которые также отформатированы, чтобы быть выровненными центром. Это делает следующее:

  1. Копирует DOCX (указанный как параметр командной строки) к /tmp, разархивировал его и открывается document.xml
  2. Сканирует XML для m:oMathPara элементы
  3. Заменяет их отформатированным w:p элементы
  4. Повторно архивирует DOCX в /tmp
  5. Открывает получающийся DOCX в LibreOffice
  6. Спрашивает, хочет ли пользователь сохранить изменения; если они отвечают да, преобразованный DOCX копируется по оригиналу для перезаписи его

Это не было протестировано очень, таким образом, необходимо создать резервную копию любых файлов, Вы используете его на на всякий случай. Обратите внимание, что это будет только работать над Linux и требует unzip инструмент, который будет установлен. (Это находится на вселенной, если у Вас нет его: 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
3
ответ дан 1 December 2019 в 13:23

Другие вопросы по тегам:

Похожие вопросы: