LibreOffice неправильно отображает уравнения Word в режиме отображения; есть ли текстовый процессор Linux, который может?
В Microsoft Word есть два способа отображения уравнений; Встроенный и Дисплей. Встроенное уравнение соответствует тексту (как следует из названия), так что уравнения и текст можно смешивать. Уравнение отображения появляется в отдельной строке и автоматически центрируется, например, так:
Это три отдельных уравнения, но поскольку они настроены на режим отображения, все они отображаются по центру и на отдельной линии. Если их режим изменяется на встроенный, все они отображаются на одной строке и не центрируются:
Моя проблема в том, что LibreOffice показывает все уравнения, используя inline-mode, даже если они установлены в display-mode в файле docx. Если я создаю первый пример, используя уравнения Word для режима отображения, сохраняю его, а затем открываю в LibreOffice, уравнения выглядят так, как если бы они были встроенными:
Есть ли настройка, которую я могу изменить, чтобы уравнения в режиме отображения находились на своих линиях и центрировались, как в Word? Из-за большого количества документов Word, которые у меня есть, я бы не стал изменять документы по отдельности.
Если нет, есть ли альтернативный текстовый процессор, который правильно отображает уравнения?
2 ответа
Когда формула вставляется в LibreOffice, она привязывается As Character
по умолчанию.
Это означает, что он ведет себя так же, как персонажи. Таким образом, мы рассматриваем это так же, как если бы у нас было три символа, например "abc" вместо трех уравнений.
- Формат -> Выровнять -> Центр
- Переместите курсор после первого уравнения и нажмите Enter.
- Повторите шаг 2 для второго уравнения.
Теперь все три уравнения центрированы и находятся на отдельных линиях.
Вот результат этих инструкций для примера "abc", показывающий, что формулы ведут себя так же, как символы. (Нажатие Enter автоматически исправляется в верхнем регистре "A").
Чтобы это работало как в MS Word, так и в LibreOffice, возможно, используйте только настройку Inline. Однако у меня нет копии MS Word, чтобы проверить это, и Word Online не может редактировать формулы (но может отображать их, если это все, что вам нужно).
Есть ли альтернативный текстовый процессор, который использует настройки формулы отображения, как MS Word? Вполне возможно; Есть ряд альтернатив, платных или бесплатных. Какую бы альтернативу вы ни выбрали, будут несовместимости какого-то рода.
Я согласился с тем, что маловероятно, что есть текстовый процессор с такой функциональностью для Linux, поэтому я решил автоматизировать ответ Джима К, создав скрипт на Ruby.
Источником проблемы является то, что LibreOffice игнорирует m:oMathPara
Элемент XML, который также является тем, что 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