LibreOffice не корректно отображает «Текстовые уравнения» в режиме отображения; есть ли текстовый процессор Linux, который может?

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

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

enter image description here [!d5]

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

enter image description here [!d5]

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

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

3
задан Aaron Christiansen 27 February 2018 в 21:09
поделиться

22 ответа

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

Это означает, что она ведет себя так же, как и символы. Таким образом, мы обрабатываем его так же, как если бы у нас было три символа, например «abc», а не три уравнения.

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

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

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

anchor as character

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

Есть ли альтернативный текстовый процессор, который использует Настройка строки Inline , как это делает MS Word? Вполне возможно; существует ряд альтернатив, оплачиваемых или свободных. Однако, какая бы альтернатива вы ни выбрали, будут какие-то несовместимости.

5
ответ дан Jim K 22 May 2018 в 12:56
поделиться
  • 1
    Хотя это действительно работает, для этого требуется, чтобы документы были изменены, что на самом деле не идеально; У меня есть документы Word на два года с использованием уравнений Display-mode, и теперь я пытаюсь переключиться на Linux. Тем не менее, благодарю вас за подробный ответ. – Aaron Christiansen 25 February 2018 в 19:55
  • 2
    Этот ответ, кажется, единственный путь, поэтому я автоматизировал его в скрипт Ruby (см. Мой ответ). Большое спасибо за то, что указали мне в правильном направлении! – Aaron Christiansen 27 February 2018 в 21:10

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

Это означает, что она ведет себя так же, как и символы. Таким образом, мы обрабатываем его так же, как если бы у нас было три символа, например «abc», а не три уравнения.

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

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

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

anchor as character [!d3]

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

Есть ли альтернативный текстовый процессор, который использует Настройка строки Inline , как это делает MS Word? Вполне возможно; существует ряд альтернатив, оплачиваемых или свободных. Однако, какая бы альтернатива вы ни выбрали, будут какие-то несовместимости.

5
ответ дан Jim K 17 July 2018 в 20:10
поделиться

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

Это означает, что она ведет себя так же, как и символы. Таким образом, мы обрабатываем его так же, как если бы у нас было три символа, например «abc», а не три уравнения.

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

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

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

anchor as character [!d3]

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

Есть ли альтернативный текстовый процессор, который использует Настройка строки Inline , как это делает MS Word? Вполне возможно; существует ряд альтернатив, оплачиваемых или свободных. Однако, какая бы альтернатива вы ни выбрали, будут какие-то несовместимости.

5
ответ дан Jim K 23 July 2018 в 20:54
поделиться
5
ответ дан Jim K 31 July 2018 в 13:14
поделиться
5
ответ дан Jim K 31 July 2018 в 19:16
поделиться
5
ответ дан Jim K 2 August 2018 в 12:17
поделиться
5
ответ дан Jim K 3 August 2018 в 16:42
поделиться
5
ответ дан Jim K 5 August 2018 в 02:02
поделиться
5
ответ дан Jim K 6 August 2018 в 18:40
поделиться
5
ответ дан Jim K 8 August 2018 в 23:00
поделиться
5
ответ дан Jim K 14 August 2018 в 12:58
поделиться

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

Происхождение проблемы состоит в том, что LibreOffice игнорирует XML-элемент m:oMathPara, который также является тем, что Word обертывает уравнение режима отображения в центре и помещает его в свой собственный параграф.

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

Копирует DOCX (указанный как аргумент командной строки) в /tmp, распаковывает его и открывает document.xml. Проверяет XML для элементов m:oMathPara. Заменяет их форматированием [ f8]. Закрепляет DOCX в /tmp. Открывает полученный DOCX в LibreOffice. спрашивает, хочет ли пользователь сохранить изменения; если они ответят «да», преобразованный 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
ответ дан Aaron Christiansen 22 May 2018 в 12:56
поделиться

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

Происхождение проблемы состоит в том, что LibreOffice игнорирует XML-элемент m:oMathPara, который также является тем, что Word обертывает уравнение режима отображения в центре и помещает его в свой собственный параграф.

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

Копирует DOCX (указанный как аргумент командной строки) в /tmp, распаковывает его и открывает document.xml. Проверяет XML для элементов m:oMathPara. Заменяет их форматированием w:p. Закрепляет DOCX в /tmp. Открывает полученный DOCX в LibreOffice. спрашивает, хочет ли пользователь сохранить изменения; если они ответят «да», преобразованный 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
ответ дан Aaron Christiansen 17 July 2018 в 20:10
поделиться

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

Происхождение проблемы состоит в том, что LibreOffice игнорирует XML-элемент m:oMathPara, который также является тем, что Word обертывает уравнение режима отображения в центре и помещает его в свой собственный параграф.

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

Копирует DOCX (указанный как аргумент командной строки) в /tmp, распаковывает его и открывает document.xml. Проверяет XML для элементов m:oMathPara. Заменяет их форматированием w:p. Закрепляет DOCX в /tmp. Открывает полученный DOCX в LibreOffice. спрашивает, хочет ли пользователь сохранить изменения; если они ответят «да», преобразованный 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
ответ дан Aaron Christiansen 23 July 2018 в 20:54
поделиться
3
ответ дан Aaron Christiansen 31 July 2018 в 13:14
поделиться
3
ответ дан Aaron Christiansen 31 July 2018 в 19:16
поделиться
3
ответ дан Aaron Christiansen 2 August 2018 в 12:17
поделиться
3
ответ дан Aaron Christiansen 3 August 2018 в 16:42
поделиться
3
ответ дан Aaron Christiansen 5 August 2018 в 02:02
поделиться
3
ответ дан Aaron Christiansen 6 August 2018 в 18:40
поделиться
3
ответ дан Aaron Christiansen 8 August 2018 в 23:00
поделиться
3
ответ дан Aaron Christiansen 14 August 2018 в 12:58
поделиться

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

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