Я пытаюсь создать сценарий gnuplot, который будет создавать клон следующего вывода: Отношения дисперсии фононов в изоляторах - Бильц, Кресс - Springer Berlin

Я хотел бы добавить следующие функции:
1. Мультиплоты для отображения переходов от одной точки симметрии к другой - без вопросов
2. Метки Latex / MathJax в терминале wxt - возможно?
3. Возможность переключения между двумя обозначениями точек симметрии - например, [00ζ] и Z
4. Надписи ветвей должны выполняться вручную, вручную вводя координаты в скрипт.

Если есть другие особенности, которые вам кажутся очевидными, прокомментируйте.
Чтобы ответ был помечен как правильный, укажите, как лучше всего перейти к функциям 2 и 3.

2
Debanjan Basu 21 Окт 2013 в 16:51

1 ответ

Лучший ответ

Относительно 2: Нет, невозможно использовать LaTeX или MathJax для меток в терминале wxt. Но это только интерактивная часть.

В этом случае вы можете использовать utf8 и enhanced, чтобы получить хотя бы правильные символы:

set encoding utf8
set termoption enhanced

set xlabel '[00ζ]'
set label at graph 0.5,0.5 'Σ_1(0)'
plot x

Для качества печати изображения вы можете использовать set terminal cairolatex pdf для использования LaTeX для этикеток:

set terminal cairolatex pdf standalone
set output 'test.tex'
set bmargin 3
set xlabel '$[00\zeta]$'
set label at graph 0.5,0.5 '$\Sigma_1(0)$'
plot x
set output
system('pdflatex test.tex')

Здесь вы должны обратить внимание на использование одинарных кавычек ', в противном случае вы должны экранировать некоторые символы.

Относительно 3: нет «автоматического» способа переключения между двумя вариантами, но вы, конечно, можете определить все метки как строку и выбирать между двумя:

latex = 1
if (latex) {
    xlabel = '$[00\zeta]$'
    label1 = '$\Sigma_1(0)$'
} else {
    xlabel = '[00ζ]'
    label1 = 'Σ_1(0)'
}
set xlabel xlabel
set label 1 at graph 0.5,0.5 label1

В целом это работает, но поскольку gnuplot не знает точной ширины и высоты метки LaTeX, может потребоваться некоторая тонкая настройка положения метки (например, с помощью offset для xlabel, или с разными позициями. В этом случае вы можете определить целые команды и вызывать их позже:

latex = 1
if (latex) {
    set_xlabel = 'set xlabel ''$[00\zeta]$'' offset 0,-1'
    set_label1 = 'set label 1 ''$\Sigma_1(0)$'' at graph 0.5,0.5'
} else {
    set_xlabel = 'set xlabel ''[00ζ]'' '
    set_label1 = 'set label 1 ''Σ_1(0)'' at graph 0.5,0.5'
}
set macros
@set_xlabel
@set_label1

Вместо использования macros вы также можете использовать eval(set_xlabel), что позволит вам определить такую ​​функцию, как:

set_label1(x,y) = sprintf('set label 1 ''$\Sigma_1(0)$'' at graph %f,%f', x, y)
eval(set_label1(0.5,0.5))
1
Christoph 22 Окт 2013 в 12:14
Вау ... не думал об использовании символов Юникода. Я нашел, что {/Symbol a} должен работать с греческими символами (в этом примере альфа). но это не сработало в wxt! Разве конструкция {/Symbol} не должна работать?
 – 
Debanjan Basu
22 Окт 2013 в 13:38
1
Да, но это работает только в расширенном режиме: set termoption enhanced; set xlabel '{/Symbol a}'; plot x.
 – 
Christoph
22 Окт 2013 в 14:21