#graphics #printing #wolfram-mathematica
#графика #печать #wolfram-mathematica
Вопрос:
Я хотел бы нарисовать прямоугольник (или больше), который, напечатанный на бумаге, показывает прямоугольник в единицах сантиметра. Итак
Graphics[{Rectangle[{0, 0}, {19, 28}], Orange, Rectangle[{0, 0}, {1, 1}]}]
будет распечатан в виде двух прямоугольников, размер которых может составлять ровно 1 см x 1 см (оранжевый), а черный — 19×28 см.
Кажется, что некоторые переменные важны: ImageSize
и, конечно, AspectRatio
.
Я использовал AspectRatio->19/28
и для ImageSize
различных настроек, подобных ImageSize->{19*27,28*27}
, но он продолжает оставаться не очень точным.
Я экспортирую графику в формат TIFF, а затем распечатываю с помощью Windows photo Gallery фотографию на всю страницу. Есть ли у кого-нибудь опыт работы с этим? Вместо метода проб и ошибок должна быть формула.
ОБНОВЛЕНИЕ: я попробовал предложение @Szabolcs и использовал следующий код:
g = Graphics[{White, EdgeForm[Directive[Thick, Black]],
Rectangle[{0, 0}, {18, 28}], Orange, Rectangle[{0, 0}, {10, 10}]}]
final = Show[g, AspectRatio -> Automatic,
PlotRange -> {{-0.5, 18.5}, {-0.5, 28.5}}]
cm = 72/2.54
Export["final.pdf", Show[final, ImageSize -> {19 cm, 29 cm}]]
Это отлично работает. Оранжевый прямоугольник размером 10×10 см равен при измерении ровно 10×10 см
значение cm 72/2.54 оказалось не таким, как я ожидал, поскольку я думал, что Windows использует 96 точек на дюйм, а Mac 72 точек на дюйм (чтение с www). Однако 72 — это значение, которое работает. Я также играл с фреймами, но потом это становится уродливым. Не нашел способа получить правильные результаты, несмотря на воспроизведение со всеми возможными настройками. Что должно сработать, так это создать рамки / тики и т.д. Самостоятельно внутри выбранных границ, но это не тот путь, которым я хотел бы следовать..
Комментарии:
1. Я думаю, что преобразование в формат TIFF и печать в виде растрового изображения не так хороши. Попробуйте экспортировать его в PDF, это намного лучше сохранит размеры.
2. Печать в масштабе, выполняемая с масштабированием 72 точки на дюйм, как указано в приведенных ниже ответах (и в документах MMA), на самом деле никогда не работала для меня. Я обнаружил, что мне нужен дополнительный коэффициент масштабирования, который я определяю за несколько итерационных проходов (печать, измерение линейкой, настройка масштаба, печать и т.д.). Если я правильно помню, среда печати также уменьшает размер до 80% рабочей среды.
3. @Sjoerd, ты пробовал мой метод с экспортом растра?
4. @Mr.wizard У меня негативные чувства по поводу создания растровых дампов на векторном лазерном принтере; это не так, как это должно быть сделано. Но в прошлом я пробовал несколько форматов, и все они нуждались в корректировках.
5. @Sjoerd, я ценю желание сохранить все в векторном формате, но я спрашиваю, потому что, насколько я могу судить, размер правильный при использовании этого метода, и я хотел бы подтверждения.
Ответ №1:
g = Graphics[{Rectangle[{0, 0}, {19, 28}], Orange, Rectangle[{0, 0}, {1, 1}]}]
Хорошо, первое, что вам нужно сделать, это установить x
и y
указания для использования одних и тех же единиц измерения, что означает
Show[g, AspectRatio -> Automatic]
Но это уже используется по умолчанию.
Второе, что вам нужно сделать, это выбрать размер и диапазон для вашей площади участка. Давайте сделаем размер 21 на 30 с вашими прямоугольниками по центру:
plotArea = {{0, 21}, {0, 30}} - {1, 1}
Show[g, AspectRatio -> Automatic, PlotRange -> plotArea]
Третье, что вам нужно сделать, это отключить добавление любых отступов / полей, которые делают фактический размер вашего рисунка больше, чем диапазон вашего графика:
final = Show[g, AspectRatio -> Automatic, PlotRange -> plotArea, PlotRangePadding -> 0, ImagePadding -> 0]
Я считаю, ImageMargins
что это не имеет значения, но если это так, установите это значение равным 0.
Последнее, что вам нужно сделать, это экспортировать это в формат для печати, который сохраняет размеры изображения, и установить размер изображения таким образом, чтобы 1 см был 1 единицей на вашем графике. Mathematica принимает размеры изображений в точках принтера, поэтому давайте определим:
cm = 72/2.54
Export["final.pdf", Show[final, ImageSize -> 21 cm]]
Мы хотим, чтобы участок был шириной 21 см, потому что его ширина составляет 21 единицу. Используйте PDF в качестве формата экспорта, а не TIFF. ImageSize
Необходимо использовать внутри Show
, чтобы обойти некоторые проблемы с Export
…
Теперь откройте свой PDF-файл в Adobe Reader, откройте диалоговое окно печать и убедитесь, что для параметра Масштабирование страницы установлено значение None! Я не знаю , как это сделать с другими читателями … Также убедитесь, что ваш рисунок помещается на бумаге (21 на 30 см слишком велик для формата А4 …).
Я не собираюсь делать тестовую печать, поэтому дайте мне знать, если это вам подойдет 🙂 Размер PDF-файла, созданного таким образом, составляет ровно 21 на 30 см, поэтому, если что-то пойдет не так, это должно произойти на этапе печати.
Комментарии:
1. Хотите верьте, хотите нет, я не копировал ваше сообщение в своем обновлении, я работал над ним, пока вы публиковали.
2. Теперь последний вопрос заключается в том, как это сделать, сохраняя при этом видимый кадр на графике!! Вероятно, слишком много возни с заполнениями … Кстати, я думаю, что как дополнение изображений, так и дополнение графиков становятся актуальными только при наличии рамки / осей.
3. Кажется, что PlotRangePadding оставляет белую рамку на образце графики, и поэтому требуется. Я подумаю о проблеме с фреймом.
4. @Szabolcs Я еще немного поэкспериментирую на работе (не хочу много печатать дома ;)) Я буду держать вас в курсе своих выводов!
5. @Mr.Wizard: LevelScheme использует точки печати (
pt
). Почти все серьезные работы по набору текста выполняются вpt
.
Ответ №2:
Я считаю, что вам нужно добавить PlotRangePadding -> None
и соответствующим образом установить размеры изображения.
В этом случае размер «ограничивающей рамки» совпадает с размером вашего большего прямоугольника: {19, 28}
Надежный способ сделать это — установить ImageSize
фактические требуемые размеры и использовать ImageResolution
, который вставит это значение в файл TIFF для правильной печати:
cm = 72 / 2.54;
g = Graphics[{Rectangle[{0, 0}, {19, 28}], Orange,
Rectangle[{0, 0}, {1, 1}]}, PlotRangePadding -> None,
ImageSize -> {19, 28}*cm];
Export["print.tif", g, ImageResolution -> 300]
Предполагается, что вы хотите печатать в растровом формате (TIFF), но вы также можете экспортировать в другие форматы, такие как PDF, тем же методом.
Комментарии:
1. Работаю над этим, пока публикую! Я попробую ваше предложение, чтобы!