Xournal-Plugins für Studierende
Plugins, die ich für die Verwendung von Xournal zum Lernen geschrieben habe
Xournal++ ist ein Programm zum handschriftlichen Notieren, das für PC und Mobilgeräte verfügbar ist. Ich benutze es gerne zum Annotieren von PDFs und Vorlesungsfolien, zum Erledigen von schriftlichen Aufgaben oder Matheaufgaben und zum Durchführen von Probeklausuren. Dabei habe ich jedoch festgestellt, dass mir einige Funktionen fehlen, die ich gerne in Xournal sehen würde. Glücklicherweise bietet Xournal eine Schnittstelle zum Schreiben von Plugins in Lua und macht es einfach, diese zu installieren und zu verwenden. Xournal ist auch Open Source, aber bisher reicht mir die Plugin-Schnittstelle für meine Zwecke aus.
Hier sind die Plugins, die ich für mich selbst geschrieben habe und immer noch verwende:
Xournal ermöglicht es Ihnen, den Hintergrund Ihres PDFs zu ändern, zum Beispiel zu kariertem oder liniertem Papier. Zum Lernen verwende ich entweder kariertes oder leeres Papier. Manchmal möchte ich zwischen diesen beiden wechseln. Allerdings habe ich bisher nur eine Möglichkeit gefunden, den Hintergrund einer Seite nach der anderen zu ändern, anstatt aller Seiten meines Dokuments. Mit meinem Plugin kann ich das jetzt tun.
-- Register all Toolbar actions and intialize all UI stuff
function initUi()
ref = app.registerUi({["menu"] = "Batch Toggle Grid", ["callback"] = "exampleCallback", ["accelerator"] = "<Control>b"});
print("Example plugin registered\n");
end
local toggleState = false
-- Callback if the menu item is executed
function exampleCallback()
--- result = app.msgbox("Test123", {[1] = "Yes", [2] = "No"});
--- print("result = " .. result)
local docStructure = app.getDocumentStructure()
local numPages = #docStructure["pages"]
local page = docStructure["currentPage"]
local background = "a"
if toggleState == true then
background = "graph";
else
background = "plain";
end
toggleState = not toggleState
for i=1, numPages do
app.setCurrentPage(i)
app.changeCurrentPageBackground(background);
end
app.setCurrentPage(page)
--- result = app.msgbox(app.getStrokes(), {[1] = "Yes", [2] = "No"});
end
Das Gleiche gilt für das Drehen der Seite um 180 Grad. Manchmal benötige ich mehr horizontalen Platz zum Schreiben, habe aber ein hochformatiges Dokument erstellt. Wenn ich meine Seiten um 90 Grad drehen möchte, muss ich dies für jede Seite tun. Hier kommt mein Plugin ins Spiel.
-- Register all Toolbar actions and intialize all UI stuff
function initUi()
ref = app.registerUi({["menu"] = "Batch Horizontal", ["callback"] = "exampleCallback", ["accelerator"] = "<Control>t"});
end
-- Callback if the menu item is executed
function exampleCallback()
--- result = app.msgbox("Test123", {[1] = "Yes", [2] = "No"});
--- print("result = " .. result)
local docStructure = app.getDocumentStructure()
local numPages = #docStructure["pages"]
local page = docStructure["currentPage"]
local width = docStructure["pages"][page]["pageWidth"]
local height = docStructure["pages"][page]["pageHeight"]
for i=1, numPages do
app.setCurrentPage(i)
app.setPageSize(height, width)
end
app.setCurrentPage(page)
-- app.uiAction({["action"]="ACTION_TOOL_SELECT_RECT"})
--- result = app.msgbox(app.getStrokes(), {[1] = "Yes", [2] = "No"});
end
Lernen kann mühsam sein, besonders wenn Sie alle Ihre Vorlesungsfolien oder Arbeitsblätter für ein Fach zusammengeführt haben und versuchen, sich durch ein tausendseitiges Dokument zu kämpfen. Es ist nützlich zu sehen, wie weit Sie gekommen sind und wie viel Fortschritt Sie im Dokument gemacht haben. Deshalb habe ich ein Plugin geschrieben, das den Prozentsatz der Folien berechnet, die Sie bereits durchgescrollt haben.
-- Register all Toolbar actions and intialize all UI stuff
function initUi()
print("Hello from Example: Plugin initUi called\n");
ref = app.registerUi({["menu"] = "Print Progress", ["callback"] = "printProgress", ["accelerator"] = "<Control>l"});
print("Menu reference:");
end
local filename = ".xppbm"
-- Callback if the menu item is executed
function printProgress()
--- print("result = " .. result)
local docStructure = app.getDocumentStructure()
local numPages = #docStructure["pages"]
local page = docStructure["currentPage"]
result = app.msgbox("Page " .. tostring(page) .. "/" .. tostring(numPages) .. ", " .. tostring((page/numPages)*100) .."%", {[1] = "Ok"});
end
Ich bin mir nicht sicher, ob dies ein Fehler oder beabsichtigtes Verhalten ist, aber auf meinem Gerät merkt sich Xournal nicht die aktuelle Seite, wenn ich ein Dokument schließe und wieder öffne. (Das ist sehr ärgerlich bei besagten langen Dokumenten.) Ich habe ein Plugin geschrieben, mit dem Sie die aktuelle Seite als Lesezeichen setzen und zu ihr springen können, auch nach dem erneuten Öffnen des Dokuments.
-- Register all Toolbar actions and intialize all UI stuff
function initUi()
ref = app.registerUi({["menu"] = "Save Current Page", ["callback"] = "onW", ["accelerator"] = "<Control>w"});
ref = app.registerUi({["menu"] = "Go To Bookmarked Page", ["callback"] = "onI", ["accelerator"] = "<Control>i"});
end
local filename = ".xppbm"
-- Callback if the menu item is executed
function exampleCallback()
result = app.msgbox("Test123", {[1] = "Yes", [2] = "No"});
--- print("result = " .. result)
local docStructure = app.getDocumentStructure()
local numPages = #docStructure["pages"]
local page = docStructure["currentPage"]
while( true )
do
os.execute("timeout " .. tonumber(3))
--result = app.msgbox("Hallo!", {[1] = "Yes", [2] = "No"});
end
saveCurrentPage()
scrollToSavedPage()
end
function onW()
local docStructure = app.getDocumentStructure()
if docStructure["currentPage"]~=1 then
saveCurrentPage()
else
scrollToSavedPage()
end
end
function onI()
local filereader, err = (io.open(filename, "r"))
filereader:close()
if filereader then
scrollToSavedPage()
else
saveCurrentPage()
end
end
function scrollToSavedPage()
local filereader, err = (io.open(filename, "r"))
if filereader then
local t = filereader:read("*all")
local loadedpagenumber = tonumber(t)
app.scrollToPage(loadedpagenumber)
end
filereader:close()
end
function saveCurrentPage()
local docStructure = app.getDocumentStructure()
local f, err = (io.open(filename, "w"))
local page = docStructure["currentPage"]
f:write(tostring(page))
f:close()
end
Noch Fragen?