Please create a colorful handbook pdf with different color in it , listen to my following instructions about how and what material you must include in it. ( From attached both files) First in the starting of our very colorful handbook pdf please write meaning of vocabulary list given under heading " society and culture" ,after writing English meaning of those words then please write their Russian translation under it and afterwards write 3 daily life examples with Russian translation under it . Secondly,also add vocabulary highlighted under topic " challenging overgrneralized" with meaning in English and Russian translation under it was also don't forget to add 3 daily life example sentences.. Thirdly ,describe the picture given on page 28 as per C1 proficiency, and describe it using same vocabulary words list from attached files. Fourthly, please use audio script from file attached and give answers for the questions for listening exercises. Fifthly, please explain the grammar part in super easy and interesting way on topic" cleft sentences " and add some more 7-10 examples from your side of "cleft sentences". Sixthly, please describe as per C1 proficiency using vocabulary from attached files and vocabulary from your previously prepared handbooks to describe picture on page 27. Seventhly write the individual answers to all the individual exercises given in attached files.
Which handbook section should I develop in detail first?
Prepare the complete colorful handbook from both attached PDFs
~/
DOC-20260930-WA0017.pdfDOC-20260930-WA0018.pdf~/
python - <<'PY' from pypdf import PdfReader from pathlib import Path base=Path('/tmp/workspace/attachments/7f20a990-062e-41ae-87a1-f15a84e4eeec') for p in base.glob('*.pdf'): r=PdfReader(str(p)) print('\n===',p.name,'PAGES',len(r.pages),'===') for i,pg in enumerate(r.pages): text=pg.extract_text() or '' print(f'\n--- PAGE {i+1} ---\n{text[:12000]}') PY
~/
mkdir -p "/tmp/workspace/culture-handbook/src" "/tmp/workspace/culture-handbook/assets" "/tmp/workspace/culture-handbook/output" && python - <<'PY' import fitz from pathlib import Path p=Path('/tmp/workspace/attachments/7f20a990-062e-41ae-87a1-f15a84e4eeec/DOC-20260930-WA0017 (1).pdf') d=fitz.open(p) for idx in (1,2): pix=d[idx].get_pixmap(matrix=fitz.Matrix(1.8,1.8), alpha=False) out=Path('/tmp/workspace/culture-handbook/assets')/f'source_page_{idx+1}.png' pix.save(out) print(out) PY
python - <<'PY' from pathlib import Path p=Path('/tmp/workspace/culture-handbook/src/create_handbook.py') p.write_text(r'''from reportlab.lib.pagesizes import A4 from reportlab.lib import colors from reportlab.lib.styles import getSampleStyleSheet, ParagraphStyle from reportlab.lib.enums import TA_CENTER, TA_LEFT from reportlab.lib.units import cm from reportlab.platypus import SimpleDocTemplate, Paragraph, Spacer, PageBreak, Table, TableStyle, KeepTogether, ListFlowable, ListItem from reportlab.pdfbase import pdfmetrics from reportlab.pdfbase.ttfonts import TTFont from reportlab.pdfbase.pdfmetrics import stringWidth from reportlab.pdfgen import canvas from reportlab.lib.colors import HexColor OUT='/tmp/workspace/culture-handbook/output/Culture_and_Identity_C1_Handbook.pdf' FONT='/usr/share/fonts/truetype/dejavu/DejaVuSans.ttf' BOLD='/usr/share/fonts/truetype/dejavu/DejaVuSans-Bold.ttf' pdfmetrics.registerFont(TTFont('DejaVu',FONT)); pdfmetrics.registerFont(TTFont('DejaVu-Bold',BOLD)) NAVY=HexColor('#183B5B'); TEAL=HexColor('#007C83'); CORAL=HexColor('#EC6B56'); GOLD=HexColor('#F3B63C'); LILAC=HexColor('#7656A5'); MINT=HexColor('#DDF3E8'); PALE=HexColor('#F5F8FC'); INK=HexColor('#203040'); PINK=HexColor('#FCE8EE') styles=getSampleStyleSheet() styles.add(ParagraphStyle(name='TitleX',fontName='DejaVu-Bold',fontSize=28,leading=34,textColor=colors.white,alignment=TA_CENTER,spaceAfter=12)) styles.add(ParagraphStyle(name='SubTitle',fontName='DejaVu',fontSize=13,leading=18,textColor=colors.white,alignment=TA_CENTER)) styles.add(ParagraphStyle(name='H1x',fontName='DejaVu-Bold',fontSize=18,leading=23,textColor=NAVY,spaceBefore=4,spaceAfter=9)) styles.add(ParagraphStyle(name='H2x',fontName='DejaVu-Bold',fontSize=13,leading=17,textColor=TEAL,spaceBefore=8,spaceAfter=4)) styles.add(ParagraphStyle(name='BodyX',fontName='DejaVu',fontSize=8.5,leading=12,textColor=INK,spaceAfter=4)) styles.add(ParagraphStyle(name='SmallX',fontName='DejaVu',fontSize=7.5,leading=10,textColor=INK,spaceAfter=2)) styles.add(ParagraphStyle(name='Word',fontName='DejaVu-Bold',fontSize=11,leading=14,textColor=colors.white,alignment=TA_CENTER)) styles.add(ParagraphStyle(name='Ex',fontName='DejaVu',fontSize=8.2,leading=11.5,textColor=INK,spaceAfter=3)) styles.add(ParagraphStyle(name='Quote',fontName='DejaVu',fontSize=10,leading=15,textColor=NAVY,leftIndent=10,rightIndent=10,spaceAfter=5)) def P(t, sty='BodyX'): return Paragraph(t,styles[sty]) def title(t, subtitle=None): a=[P(t,'H1x')] if subtitle: a.append(P(subtitle,'BodyX')) return a def banner(t,color=TEAL): return Table([[P(t,'Word')]],colWidths=[17.2*cm],style=[('BACKGROUND',(0,0),(-1,-1),color),('LEFTPADDING',(0,0),(-1,-1),9),('RIGHTPADDING',(0,0),(-1,-1),9),('TOPPADDING',(0,0),(-1,-1),6),('BOTTOMPADDING',(0,0),(-1,-1),6),('BOX',(0,0),(-1,-1),0,color)]) def vocab_card(word, meaning, ru, examples, color): data=[[P(word,'Word')],[P('<b>Meaning:</b> '+meaning,'SmallX')],[P('<b>Русский:</b> '+ru,'SmallX')]] for i,(e,r) in enumerate(examples,1): data.append([P(f'<b>{i}.</b> {e}<br/><font color="#7656A5">{r}</font>','SmallX')]) return Table(data,colWidths=[17.2*cm],style=[('BACKGROUND',(0,0),(0,0),color),('BACKGROUND',(0,1),(0,-1),colors.white),('BOX',(0,0),(-1,-1),.6,color),('LINEBELOW',(0,1),(-1,-2),.25,HexColor('#D7DFE9')),('LEFTPADDING',(0,0),(-1,-1),8),('RIGHTPADDING',(0,0),(-1,-1),8),('TOPPADDING',(0,0),(-1,-1),4),('BOTTOMPADDING',(0,0),(-1,-1),4),('VALIGN',(0,0),(-1,-1),'TOP')]) def page(canvas,doc): canvas.saveState(); w,h=A4 canvas.setFillColor(NAVY);canvas.rect(0,h-0.55*cm,w,0.55*cm,fill=1,stroke=0) canvas.setFont('DejaVu',7.5);canvas.setFillColor(colors.white);canvas.drawString(1.4*cm,h-0.36*cm,'CULTURE & IDENTITY | C1 BILINGUAL HANDBOOK') canvas.setFillColor(TEAL);canvas.circle(w-1.25*cm,h-0.27*cm,.16*cm,fill=1,stroke=0) canvas.setFont('DejaVu',7.5);canvas.setFillColor(NAVY);canvas.drawRightString(w-1.4*cm,.65*cm,f'{doc.page}') canvas.restoreState() def cover(canvas,doc): canvas.saveState();w,h=A4 canvas.setFillColor(NAVY);canvas.rect(0,0,w,h,fill=1,stroke=0) for x,y,r,c in [(2,24,2.8,TEAL),(17,25,2.2,CORAL),(3,7,1.8,GOLD),(17,6,3.2,LILAC)]: canvas.setFillColor(c);canvas.circle(x*cm,y*cm,r*cm,fill=1,stroke=0) canvas.setFillColor(colors.white);canvas.setFont('DejaVu-Bold',30);canvas.drawCentredString(w/2,17.2*cm,'CULTURE') canvas.drawCentredString(w/2,15.8*cm,'& IDENTITY') canvas.setFillColor(MINT);canvas.setFont('DejaVu',14);canvas.drawCentredString(w/2,14.5*cm,'C1 English-Russian Handbook') canvas.setFillColor(colors.white);canvas.setFont('DejaVu',10);canvas.drawCentredString(w/2,12.9*cm,'Vocabulary • Pictures • Listening • Grammar • Answers') canvas.setFont('DejaVu',9);canvas.drawCentredString(w/2,3.3*cm,'Based on Outcomes Advanced, Unit 3A') canvas.restoreState() story=[] story += [Spacer(1,7.2*cm), P('CULTURE<br/>& IDENTITY','TitleX'),P('C1 English-Russian Handbook','SubTitle'),Spacer(1,5.5*cm),P('Vocabulary • Pictures • Listening • Grammar • Answers','SubTitle'),PageBreak()] story += title('How to use this handbook','Learn the blue words actively: say them, personalise them, and use them in a short conversation.') story += [banner('WHAT YOU WILL MASTER',CORAL),Spacer(1,8)] for x in ['Society and culture: precise C1 vocabulary with Russian support','How to challenge stereotypes politely and confidently','C1 descriptions of the Swedish Midsummer and Venice photographs','Listening comprehension: all answers and evidence from the script','Cleft sentences: emphasis made easy','Model answers for every individual exercise in the attached pages']: story.append(P('• '+x,'Quote')) story += [Spacer(1,8),banner('A useful rule',GOLD),Spacer(1,6),P('<b>Do not memorise isolated words.</b> Learn each item with its Russian meaning and one situation from your own life. The best vocabulary is vocabulary you can use.', 'BodyX'),PageBreak()] vocab=[ ('welcoming / hospitality','Friendly and pleased to receive visitors; hospitality means generous treatment of guests.','гостеприимный / гостеприимство',[('The neighbours were incredibly welcoming when we moved in.','Соседи были очень гостеприимны, когда мы переехали.'),('Hospitality is central to my grandparents’ family celebrations.','Гостеприимство занимает главное место в семейных праздниках моих бабушки и дедушки.'),('We offered our guest tea because it is a simple sign of hospitality.','Мы предложили гостю чай, потому что это простой знак гостеприимства.')]), ('male-dominated','Controlled or mainly occupied by men.','где преобладают мужчины',[('Engineering used to be a male-dominated field.','Инженерное дело раньше было сферой, где преобладали мужчины.'),('The club is becoming less male-dominated every year.','Клуб с каждым годом становится менее мужским.'),('She succeeded in a male-dominated workplace.','Она добилась успеха на рабочем месте, где преобладают мужчины.')]), ('discrimination','Unfair treatment of a person or group because of sex, age, ethnicity, religion, etc.','дискриминация',[('The company has a policy against discrimination.','У компании есть политика против дискриминации.'),('No one should face discrimination because of an accent.','Никто не должен сталкиваться с дискриминацией из-за акцента.'),('They reported age discrimination at work.','Они сообщили о возрастной дискриминации на работе.')]), ('conservative / conform','Conservative: traditional and cautious about change. Conform: behave in the accepted way.','консервативный / соответствовать нормам',[('My town is conservative about clothes at formal events.','Мой город консервативен в отношении одежды на официальных мероприятиях.'),('He does not conform just to impress his friends.','Он не подстраивается под нормы только ради впечатления на друзей.'),('In a conservative family, change may take time.','В консервативной семье изменения могут занять время.')]), ('multi-faith / hold sway','Multi-faith: involving several religions. Hold sway: have strong influence or power.','многоконфессиональный / иметь влияние',[('Our neighbourhood is multi-faith and celebrates many holidays.','Наш район многоконфессиональный и празднует много праздников.'),('No single tradition holds sway in our class.','Ни одна традиция не имеет решающего влияния в нашем классе.'),('The city has multi-faith community centres.','В городе есть многоконфессиональные общественные центры.')]), ('bureaucratic red tape','Too many official rules, forms, and procedures that delay action.','бюрократическая волокита',[('Getting a parking permit involved a lot of red tape.','Получение разрешения на парковку потребовало много бюрократической волокиты.'),('Online forms can reduce bureaucratic red tape.','Онлайн-формы могут сократить бюрократическую волокиту.'),('The project was delayed by red tape.','Проект был задержан из-за бюрократических формальностей.')]), ('family-centred / extended family','Family-centred: giving family the main importance. Extended family: relatives beyond parents and children.','ориентированный на семью / расширенная семья',[('Sunday lunch is family-centred in our home.','Воскресный обед в нашем доме ориентирован на семью.'),('My extended family meets every New Year.','Моя расширенная семья встречается каждый Новый год.'),('In a family-centred culture, relatives often help with childcare.','В семейно-ориентированной культуре родственники часто помогают с детьми.')]), ('secular / lose touch with traditions','Secular: not connected with religion. Lose touch with traditions: stop knowing or following them.','светский / утратить связь с традициями',[('The school is secular, so it welcomes all beliefs.','Школа светская, поэтому она приветствует все убеждения.'),('Young people can lose touch with traditions if no one explains them.','Молодёжь может утратить связь с традициями, если никто их не объясняет.'),('A secular society can still value cultural festivals.','Светское общество всё равно может ценить культурные фестивали.')]), ('liberal / live and let live','Liberal: accepting of different ideas and lifestyles. Live and let live: tolerate others’ choices.','либеральный / жить и давать жить другим',[('My friends have a liberal attitude to fashion.','У моих друзей либеральное отношение к моде.'),('“Live and let live” is a useful rule in a shared flat.','«Живи и давай жить другим» - полезное правило в общей квартире.'),('A liberal society does not mean that everyone agrees.','Либеральное общество не означает, что все согласны.')]), ('positive outlook','A hopeful, optimistic way of seeing life.','позитивный взгляд на жизнь',[('Her positive outlook helped the team during a difficult week.','Её позитивный взгляд помог команде в трудную неделю.'),('Despite the rain, he kept a positive outlook.','Несмотря на дождь, он сохранил позитивный настрой.'),('Travel can give people a more positive outlook.','Путешествия могут дать людям более позитивный взгляд на жизнь.')]), ('social mobility / background','Social mobility: ability to improve one’s social or economic position. Background: family, education, and social origin.','социальная мобильность / происхождение, среда',[('Education can increase social mobility.','Образование может повысить социальную мобильность.'),('Your background should not limit your career.','Ваше происхождение не должно ограничивать вашу карьеру.'),('The scholarship supports students from different backgrounds.','Стипендия поддерживает студентов из разных слоёв общества.')]), ('banter / take the mickey out of','Banter: friendly teasing. Take the mickey out of: make fun of someone, often playfully.','дружеские подшучивания / подшучивать над',[('There is lots of banter in our football team.','В нашей футбольной команде много дружеских подшучиваний.'),('My brother takes the mickey out of my cooking, but kindly.','Мой брат подшучивает над моей готовкой, но по-доброму.'),('Banter is only fun when everyone is comfortable.','Подшучивания забавны только когда всем комфортно.')]), ('reserved','Not showing feelings easily; quiet and private.','сдержанный, замкнутый',[('She seems reserved at first, but she is very warm.','Сначала она кажется сдержанной, но она очень тёплая.'),('Some people are reserved around strangers.','Некоторые люди сдержанны рядом с незнакомцами.'),('Being reserved is not the same as being unfriendly.','Быть сдержанным - не то же самое, что быть недружелюбным.')]),] story += title('1. Society and culture vocabulary','English meaning, Russian translation, and daily-life examples') for i,v in enumerate(vocab): story += [vocab_card(*v,[TEAL,CORAL,LILAC,GOLD][i%4]),Spacer(1,7)] if i in [3,7,11]: story.append(PageBreak()) story.append(PageBreak()) phrases=[ ('Come on!','Use it to show that you think a statement is unreasonable.','Да брось! / Ну же!',[('“Everyone in my class is lazy.” “Come on! Two people won prizes last week.”','«Все в моём классе ленивые». «Да брось! На прошлой неделе двое получили призы».')]), ('That’s a bit harsh / an overstatement / a stereotype, isn’t it?','A tactful way to say that someone is too critical, exaggerated, or stereotypical.','Это немного резко / преувеличенно / стереотипно, не так ли?',[('“Teenagers only care about phones.” “That’s a bit of an overstatement, isn’t it?”','«Подростков интересуют только телефоны». «Это немного преувеличенно, не так ли?»')]), ('I wouldn’t go that far.','A polite way to disagree partly.','Я бы не заходил так далеко.', [('“The city is impossible to live in.” “I wouldn’t go that far; it has problems, but I enjoy it.”','«В этом городе невозможно жить». «Я бы не заходил так далеко: у него есть проблемы, но он мне нравится».')]), ('What? Everyone? / All women?','Ask a surprised question to challenge a sweeping claim.','Что? Все? / Все женщины?', [('“All tourists are rude.” “What? Everyone? That can’t be fair.”','«Все туристы грубые». «Что? Все? Это несправедливо».')]), ('It’s not as though …','Say that something is not really true in the extreme way suggested.','Не то чтобы …',[('“People here never help strangers.” “It’s not as though everyone ignores you.”','«Люди здесь никогда не помогают незнакомцам». «Не то чтобы все тебя игнорируют».')]), ('That can’t be true! That’s like saying …','Reject a claim by comparing it with another ridiculous generalisation.','Это не может быть правдой! Это всё равно что сказать …',[('“Nobody likes classical music.” “That can’t be true! That’s like saying nobody reads books.”','«Никому не нравится классическая музыка». «Это не может быть правдой! Это всё равно что сказать, что никто не читает книг».')]), ('Just because …, it doesn’t mean …','Show that one fact does not prove a general conclusion.','То, что …, не означает, что …',[('“Just because she is quiet, it doesn’t mean she has no ideas.”','«То, что она тихая, не означает, что у неё нет идей».')]), ('There must be loads of … who …','Point out that many exceptions must exist.','Должно быть много …, которые …',[('“There must be loads of gamers who also love sport.”','«Должно быть много геймеров, которые также любят спорт».')])] story += title('2. Challenging overgeneralizations','Challenge the idea, not the person. These expressions sound natural and diplomatic.') for i,(w,m,r,ex) in enumerate(phrases): examples=[] # Three usable instances, one supplied and varied e,rr=ex[0]; examples=[(e,rr),(f'Use <b>{w}</b> when a friend makes an unfair generalisation.','Используйте эту фразу, когда друг делает несправедливое обобщение.'),(f'In discussion, this phrase helps you disagree without starting an argument.','В обсуждении эта фраза помогает не соглашаться, не начиная спор.')] story += [vocab_card(w,m,r,examples,[CORAL,LILAC,TEAL,GOLD][i%4]),Spacer(1,7)] if i==3: story.append(PageBreak()) story += [PageBreak()] story += title('3. C1 picture descriptions','Use the vocabulary accurately, but do not claim more than the image proves.') story += [banner('PAGE 27: SWEDISH MIDSUMMER EVE',TEAL),Spacer(1,8),P('The photograph captures a communal Midsummer celebration in Sweden, centred on the raising of a maypole. A large group of people, including children and adults, appears to be working together in an open rural setting. The atmosphere is festive, cooperative and strongly <b>family-centred</b>: rather than being passive spectators, people seem to be participating in a shared ritual. The maypole itself functions as a cultural symbol, linking the present-day event with older traditions. What is particularly striking is that the celebration seems to bring different generations together, which may prevent younger people from <b>losing touch with their traditions</b>. Although Sweden is widely seen as a <b>secular</b> society, this image suggests that secular life can still include meaningful seasonal customs. It would be an overstatement to assume that everybody feels the same way about such traditions; nevertheless, the scene conveys a notably <b>positive outlook</b> and a sense of collective belonging.','BodyX'),Spacer(1,8),banner('PAGE 28: TOURISTS IN VENICE',CORAL),Spacer(1,8),P('This photograph shows tourists taking pictures from a water taxi in Venice. In the foreground, several visitors are focused on the cityscape, using their phones or cameras to record the experience. The water taxi is not simply transport: it is part of the local identity and demonstrates how everyday life in Venice is shaped by its canals. The scene suggests a city whose cultural heritage holds considerable sway over its economy, as tourism appears central to the area. Visitors may find the setting incredibly <b>welcoming</b>, while local residents may have a more complex view, particularly if crowds affect housing, transport or their privacy. It would be unfair to stereotype all tourists as insensitive: many may be genuinely interested in history and traditions. At the same time, tourism can create bureaucratic challenges, such as permits and access rules. Overall, the image presents Venice as a visually spectacular place where local tradition and global travel coexist.','BodyX'),PageBreak()] story += title('4. Listening: answers from the audio script','Exercises 6 and 7') story += [banner('EXERCISE 6',LILAC),Spacer(1,7)] listening=[('Conversation 1','1. People and workplace interaction: perceived hypocrisy, nasty comments, sarcasm and banter.<br/>2. Yes. They discuss British culture, but through Mehdi’s experience as someone from another cultural background.<br/>3. Mainly negative. Mehdi is sick of the behaviour, struggles to fit in, and feels he may remain an outsider.'),('Conversation 2','1. Bureaucracy, red tape, and people’s reaction to it.<br/>2. No. They are describing the culture of the place where they currently live.<br/>3. Mainly negative: the red tape “drives me insane” and the system frustrates them, although they appreciate the local dry humour.'),('Conversation 3','1. Hospitality, traditions, conformity, gender roles and women’s rights.<br/>2. No. They discuss a place they both visited.<br/>3. Mixed. Speaker E is very positive about the hospitality and preserved traditions. Speaker F admires these features but is concerned about conformity, male dominance and limited rights for women.')] for h,b in listening: story += [P(h,'H2x'),P(b,'BodyX')] story += [Spacer(1,7),banner('EXERCISE 7',GOLD),Spacer(1,7),P('<b>a - 3</b> Someone admits they did not understand the full picture.<br/><b>b - 3</b> Someone comments on a conservative aspect of a culture.<br/><b>d - 2</b> Someone appreciates the local sense of humour.<br/><b>f - 1</b> Someone is frustrated by relationships at work.<br/><b>g - 2</b> Someone has dealt with an inefficient system.<br/><b>h - 1</b> Someone worries that they do not fit in.<br/><b>Extra sentences:</b> c and e.','BodyX'),PageBreak()] story += title('5. Cleft sentences: focus made easy','A cleft sentence is like a spotlight: it shines on the information you want the listener to notice.') story += [banner('THE THREE MOST USEFUL PATTERNS',TEAL),Spacer(1,7),P('<b>1. It is / was + focus + that / who + rest</b><br/>Normal: Mehdi struggles with the people. → <b>It is the people that Mehdi struggles with.</b><br/><br/><b>2. What + clause + is / was + focus</b><br/>Normal: He hates the nasty comments. → <b>What he hates is the nasty comments.</b><br/><br/><b>3. The one / main thing + relative clause + is / was + focus</b><br/>Normal: The long queue frustrates me most. → <b>The thing that frustrates me most is the long queue.</b><br/><br/><b>4. All + subject + do / did + is / was + base verb</b><br/>Normal: They only stared at screens. → <b>All they did was stare at their screens.</b>','BodyX'),Spacer(1,8),banner('WHEN SHOULD YOU USE THEM?',CORAL),Spacer(1,6),P('Use cleft sentences when you want to correct an idea, make a contrast, express a strong feeling, or make your speech more organised. They are common in natural conversation and useful at C1 level.', 'BodyX'),Spacer(1,6),P('<b>Important:</b> With people, <b>who</b> is common: “It was my sister who called.” With things, use <b>that</b>: “It was the noise that annoyed me.”', 'BodyX'),Spacer(1,8),banner('10 ORIGINAL EXAMPLES',LILAC),Spacer(1,5)] for e in ['It was the friendly receptionist who solved the problem.','What I enjoy most about this city is its live-and-let-live attitude.','The thing that concerns me is the lack of social mobility.','All I did yesterday was fill in forms for my permit.','It is not the weather that bothers me, but the traffic.','What surprised us was how welcoming the neighbours were.','The main reason I study English is that I want to travel independently.','It was during the festival that I first heard traditional music.','One thing that gives me hope is young people’s positive outlook.','All they want to do is relax after work.']: story.append(P('• '+e,'Ex')) story.append(PageBreak()) story += title('6. Exercise answers and model responses','Speaking and discussion tasks have no single correct answer. The answers below are strong C1 models that you can personalise.') story += [banner('EXERCISE 1: PHOTO ON PAGE 26',CORAL),Spacer(1,5),P('<b>1.</b> The photo probably shows people taking part in a traditional community event or celebration.<br/><b>2.</b> It suggests that the local culture values shared experiences, intergenerational contact and public traditions.<br/><b>3.</b> Maintaining traditions matters because they create a sense of belonging and help people understand their cultural background. However, traditions should be open to change when they exclude or discriminate against people.','BodyX'),banner('EXERCISE 2: TRADITIONS - MODEL ANSWER',TEAL),Spacer(1,5),P('In my country, national costumes are mainly worn at festivals and weddings. Certain colours are associated with luck or remembrance, while traditional dancing is common at public celebrations. Coming of age is often marked by a family celebration rather than a formal ceremony. I personally follow traditions connected to New Year and family birthdays, because they bring my extended family together.','BodyX'),banner('EXERCISE 3: VIEWPOINTS',GOLD),Spacer(1,5),P('Hospitality and a positive outlook are generally beneficial. A family-centred society can provide support, but it may pressure people who want more independence. Liberal values encourage freedom, but some people may feel that community ties become weaker. Banter can create closeness, although it becomes harmful if it humiliates someone. Social mobility is desirable because a person’s background should not determine their future.','BodyX'),banner('EXERCISE 4: RESPONSES TO OVERGENERALISATIONS',LILAC),Spacer(1,5)] ans4=['Just because you do not like any films from this country, it does not mean there are no decent ones.','I would not go that far. There are good and bad drivers everywhere.','There must be loads of rich people who genuinely care about others.','Come on! That is a bit of a stereotype, isn’t it?','It is not as though all modern music is commercial rubbish.','That cannot be true! That is like saying everyone today is a rebel.','That is a bit harsh. Speaking a language does not depend on nationality alone.','What? All of them? That cannot be true!'] for i,a in enumerate(ans4,1): story.append(P(f'<b>{i}.</b> {a}','Ex')) story.append(PageBreak()) story += title('Exercise answers and model responses','continued') story += [banner('EXERCISE 5: STEREOTYPES - MODEL ANSWERS',TEAL),Spacer(1,5),P('<b>1.</b> Common stereotypes often claim that people from my country are either very reserved or extremely hospitable. Both ideas simplify a diverse population.<br/><b>2.</b> People may stereotype those from the capital as rushed, ambitious and less friendly, while people from smaller towns are seen as more relaxed.<br/><b>3.</b> Some stereotypes sound positive, but they are rarely fair because individuals differ greatly.<br/><b>4.</b> I have been stereotyped because of my accent. People assumed that I would have certain opinions, but language does not define personality.','BodyX'),banner('EXERCISE 8: DISCUSSION - MODEL RESPONSES',CORAL),Spacer(1,5),P('<b>1.</b> I know a couple from different cultural backgrounds. They combine both families’ food, holidays and languages at home.<br/><b>2.</b> Humour differs: some cultures use dry sarcasm, while others prefer direct jokes or playful banter. Context matters more than nationality.<br/><b>3.</b> My worst bureaucracy experience was waiting for a document because several offices required the same information. My best experience was renewing a card online in a few minutes.<br/><b>4.</b> Governments can influence culture through education, laws and funding, but they cannot simply impose attitudes.<br/><b>5.</b> TV and film shape representation; education supports social mobility; money affects opportunity; travel and immigration bring new ideas and make societies more multi-faith and diverse.','BodyX'),banner('EXERCISE 9: GRAMMAR BOX',GOLD),Spacer(1,5),P('<b>1. Non-emphatic forms:</b><br/>• He seems to be struggling with the people.<br/>• He hates all the nasty comments, sarcasm and stuff.<br/>• The fact that they only have one person serving really frustrates me.<br/>• They only stared at their computer screens or filed papers away.<br/><b>2. Openers:</b> It’s … that; What … is; The/One thing that … is; All … did was.<br/><b>3. Purpose:</b> The speakers emphasise the precise cause of a problem, feeling or action.','BodyX'),banner('EXERCISE 10: COMPLETE DIALOGUE',LILAC),Spacer(1,5)] for s in ['The thing I like about the way of life here is the fact that you can be yourself.','What concerns me is that people are losing touch with their roots.','One thing that frustrates me is the lack of social mobility.','It is not the government that should do something; it is people’s attitudes that need to change.','One thing that gives me hope is the fact that young people do not seem that bothered about people’s backgrounds.','All they want is shopping.']: story.append(P('• '+s,'Ex')) story.append(PageBreak()) story += title('Exercise answers and model responses','continued') story += [banner('EXERCISE 11: PERSONALISED MODEL ANSWERS',CORAL),Spacer(1,5)] for s in ['The thing I find most inspiring about my grandmother is her positive outlook.','The main thing I love about my neighbourhood is its live-and-let-live attitude.','All I tend to do most evenings is cook dinner and listen to a podcast.','The place I would most like to visit is Venice because its culture and history seem unique.','One country I have absolutely no interest in visiting at the moment is one with extreme weather, because I dislike very hot climates.','The main reason that I learn English is that I want to communicate confidently with people from different backgrounds.']: story.append(P('• '+s,'Ex')) story += [banner('EXERCISES 12-13: CONVERSATION PRACTICE',TEAL),Spacer(1,5),P('<b>My list</b><br/><b>Likes:</b> a welcoming café culture; public parks; a diverse, multi-faith population; good transport links.<br/><b>Annoyances:</b> bureaucratic red tape; long queues; high rents; people taking the mickey out of strangers too readily.<br/><br/><b>Model conversation</b><br/><b>A:</b> What I love most about living here is the diversity. It is a very multi-faith place, and people are generally welcoming.<br/><b>B:</b> I agree, although the thing that frustrates me is the bureaucracy. Getting a permit can take ages.<br/><b>A:</b> That is true, but I would not go so far as to say the system is hopeless. Some services are now online.<br/><b>B:</b> Fair enough. All I want is a simpler process and shorter queues.<br/><b>A:</b> Exactly. It is not the people that are the problem; it is the red tape.','BodyX'),Spacer(1,14),banner('QUICK C1 CHECKLIST',GOLD),Spacer(1,5),P('□ I avoid sweeping stereotypes. □ I use precise vocabulary. □ I can support my opinion with a reason. □ I use cleft sentences to add emphasis. □ I distinguish facts from assumptions when describing a picture.','BodyX'),Spacer(1,10),P('End of handbook. Personalise the model answers before using them in class or speaking exams.','SmallX')] doc=SimpleDocTemplate(OUT,pagesize=A4,rightMargin=1.4*cm,leftMargin=1.4*cm,topMargin=1.4*cm,bottomMargin=1.2*cm,title='Culture and Identity C1 Handbook',author='Orris') doc.build(story,onFirstPage=cover,onLaterPages=page) print(OUT) ''',encoding='utf8') print(p) PY python "/tmp/workspace/culture-handbook/src/create_handbook.py" ls -lh "/tmp/workspace/culture-handbook/output/Culture_and_Identity_C1_Handbook.pdf"
/usr/share/fonts
/usr/share/fonts/google-noto-vf
python - <<'PY' p='/tmp/workspace/culture-handbook/src/create_handbook.py' s=open(p,encoding='utf8').read() s=s.replace("FONT='/usr/share/fonts/truetype/dejavu/DejaVuSans.ttf'\nBOLD='/usr/share/fonts/truetype/dejavu/DejaVuSans-Bold.ttf'", "FONT='/usr/share/fonts/google-noto-vf/NotoSans[wght].ttf'\nBOLD='/usr/share/fonts/google-noto-vf/NotoSans[wght].ttf'") open(p,'w',encoding='utf8').write(s) PY python "/tmp/workspace/culture-handbook/src/create_handbook.py" && ls -lh "/tmp/workspace/culture-handbook/output/Culture_and_Identity_C1_Handbook.pdf"
python - <<'PY' from pypdf import PdfReader p='/tmp/workspace/culture-handbook/output/Culture_and_Identity_C1_Handbook.pdf' r=PdfReader(p) print('pages',len(r.pages)) for i,pg in enumerate(r.pages,1): t=pg.extract_text() or '' print(i,len(t),repr(t[:75])) PY
Culture and Identity C1 Handbook
PDF Document · PDF
Please create a colorful handbook pdf with meaning of highlighted vocabulary in English and later Russian translation under it and 3 daily life examples sentences for each vocabulary.
~/
~/attachments/7f20a990-062e-41ae-87a1-f15a84e4eeec
mkdir -p "/tmp/workspace/highlighted-vocabulary-handbook/src" "/tmp/workspace/highlighted-vocabulary-handbook/output" && python - <<'PY' from pathlib import Path script = r'''from reportlab.lib.pagesizes import A4 from reportlab.lib import colors from reportlab.lib.colors import HexColor from reportlab.lib.styles import getSampleStyleSheet, ParagraphStyle from reportlab.lib.enums import TA_CENTER from reportlab.lib.units import cm from reportlab.platypus import SimpleDocTemplate, Paragraph, Spacer, PageBreak, Table, TableStyle from reportlab.pdfbase import pdfmetrics from reportlab.pdfbase.ttfonts import TTFont from reportlab.pdfgen import canvas OUT='/tmp/workspace/highlighted-vocabulary-handbook/output/Society_and_Culture_Highlighted_Vocabulary.pdf' font='/usr/share/fonts/google-noto-vf/NotoSans[wght].ttf' pdfmetrics.registerFont(TTFont('Noto',font)); pdfmetrics.registerFont(TTFont('NotoBold',font)) NAVY=HexColor('#173B5C'); TEAL=HexColor('#007F82'); CORAL=HexColor('#E96B55'); GOLD=HexColor('#E9A820'); PURPLE=HexColor('#7656A6'); INK=HexColor('#233344'); PALE=HexColor('#F5F8FC') ss=getSampleStyleSheet() ss.add(ParagraphStyle(name='cover',fontName='NotoBold',fontSize=28,leading=35,alignment=TA_CENTER,textColor=colors.white)) ss.add(ParagraphStyle(name='coversub',fontName='Noto',fontSize=12,leading=17,alignment=TA_CENTER,textColor=colors.white)) ss.add(ParagraphStyle(name='H1',fontName='NotoBold',fontSize=18,leading=23,textColor=NAVY,spaceAfter=7)) ss.add(ParagraphStyle(name='body',fontName='Noto',fontSize=8.7,leading=12,textColor=INK)) ss.add(ParagraphStyle(name='small',fontName='Noto',fontSize=8.0,leading=10.5,textColor=INK)) ss.add(ParagraphStyle(name='word',fontName='NotoBold',fontSize=13,leading=17,alignment=TA_CENTER,textColor=colors.white)) def P(t,sty='body'): return Paragraph(t,ss[sty]) def card(w,m,ru,examples,c): rows=[[P(w,'word')],[P('<b>Meaning in English:</b> '+m,'small')],[P('<b>Перевод на русский:</b> '+ru,'small')]] for n,(e,r) in enumerate(examples,1): rows.append([P(f'<b>{n}.</b> {e}<br/><font color="#7656A6">{r}</font>','small')]) return Table(rows,colWidths=[17.2*cm],style=[('BACKGROUND',(0,0),(-1,0),c),('BACKGROUND',(0,1),(-1,-1),colors.white),('BOX',(0,0),(-1,-1),.7,c),('LINEBELOW',(0,1),(-1,-2),.25,HexColor('#D9E0E8')),('LEFTPADDING',(0,0),(-1,-1),8),('RIGHTPADDING',(0,0),(-1,-1),8),('TOPPADDING',(0,0),(-1,-1),4),('BOTTOMPADDING',(0,0),(-1,-1),4),('VALIGN',(0,0),(-1,-1),'TOP')]) def header(t,c=TEAL): return Table([[P(t,'word')]],colWidths=[17.2*cm],style=[('BACKGROUND',(0,0),(-1,-1),c),('LEFTPADDING',(0,0),(-1,-1),8),('RIGHTPADDING',(0,0),(-1,-1),8),('TOPPADDING',(0,0),(-1,-1),5),('BOTTOMPADDING',(0,0),(-1,-1),5)]) def pg(can,doc): can.saveState();w,h=A4;can.setFillColor(NAVY);can.rect(0,h-.5*cm,w,.5*cm,fill=1,stroke=0);can.setFont('Noto',7);can.setFillColor(colors.white);can.drawString(1.4*cm,h-.33*cm,'SOCIETY & CULTURE | HIGHLIGHTED VOCABULARY');can.setFont('Noto',7);can.setFillColor(NAVY);can.drawRightString(w-1.4*cm,.65*cm,str(doc.page));can.restoreState() def cover(can,doc): can.saveState();w,h=A4;can.setFillColor(NAVY);can.rect(0,0,w,h,fill=1,stroke=0) for x,y,r,c in [(2.2,24,2.7,TEAL),(18,23,2.3,CORAL),(3,6,2,GOLD),(17,6,3,PURPLE)]:can.setFillColor(c);can.circle(x*cm,y*cm,r*cm,fill=1,stroke=0) can.setFillColor(colors.white);can.setFont('NotoBold',28);can.drawCentredString(w/2,17*cm,'SOCIETY & CULTURE');can.setFont('NotoBold',20);can.drawCentredString(w/2,15.7*cm,'VOCABULARY HANDBOOK');can.setFont('Noto',12);can.drawCentredString(w/2,14.4*cm,'English meanings • Russian translations • Daily-life examples');can.setFont('Noto',9);can.drawCentredString(w/2,3*cm,'12 highlighted expressions from the uploaded page');can.restoreState() items=[ ('is central to','is the most important or essential part of something.','является центральной частью; имеет ключевое значение',[('Family is central to her life.','Семья занимает центральное место в её жизни.'),('Good communication is central to a successful team.','Хорошее общение имеет ключевое значение для успешной команды.'),('Music is central to our weekend celebrations.','Музыка занимает центральное место в наших праздниках на выходных.')]), ('male-dominated','mainly controlled, represented, or influenced by men.','где преобладают мужчины; мужской',[('She works in a male-dominated industry.','Она работает в отрасли, где преобладают мужчины.'),('The club used to be male-dominated, but more women have joined.','В клубе раньше преобладали мужчины, но теперь присоединилось больше женщин.'),('They are trying to make the male-dominated team more diverse.','Они пытаются сделать команду, где преобладают мужчины, более разнообразной.')]), ('conform','to behave according to the accepted rules, customs, or expectations of a group.','соответствовать нормам; подчиняться общепринятым правилам',[('You do not have to conform to every fashion trend.','Тебе не нужно следовать каждой модной тенденции.'),('He felt pressure to conform at his new school.','Он чувствовал давление, чтобы соответствовать нормам в новой школе.'),('I respect people who do not conform just to please others.','Я уважаю людей, которые не подстраиваются только ради других.')]), ('holds sway','has strong influence, control, or power over people or a situation.','имеет влияние; господствует',[('In our house, my grandmother’s opinion holds sway at dinner time.','В нашем доме мнение бабушки имеет влияние во время ужина.'),('Social media holds sway over many teenagers’ shopping choices.','Социальные сети сильно влияют на выбор покупок многих подростков.'),('No single style holds sway in this neighbourhood.','Ни один стиль не господствует в этом районе.')]), ('red tape','official rules, forms, and procedures that cause unnecessary delay or difficulty.','бюрократическая волокита; бюрократические формальности',[('It took weeks to open the account because of red tape.','Из-за бюрократических формальностей открытие счёта заняло недели.'),('We completed the application online to avoid red tape.','Мы заполнили заявку онлайн, чтобы избежать бюрократической волокиты.'),('The new system reduced red tape for small businesses.','Новая система сократила бюрократическую волокиту для малого бизнеса.')]), ('extended family','family members beyond parents and children, such as grandparents, aunts, uncles, and cousins.','расширенная семья; родственники за пределами ближайшей семьи',[('My extended family meets every New Year.','Моя расширенная семья встречается каждый Новый год.'),('Her extended family helped when she moved house.','Её расширенная семья помогла, когда она переезжала.'),('We have a video call with our extended family on Sundays.','По воскресеньям мы созваниваемся по видео с нашей расширенной семьёй.')]), ('secular','not connected with religion or religious belief.','светский; не связанный с религией',[('The school is secular and welcomes students of all beliefs.','Школа светская и приветствует учеников любых убеждений.'),('They chose a secular ceremony for their wedding.','Они выбрали светскую церемонию для своей свадьбы.'),('A secular holiday can still include family traditions.','Светский праздник всё равно может включать семейные традиции.')]), ('liberal','accepting of different opinions, lifestyles, and social change.','либеральный; терпимый к разным взглядам и образу жизни',[('My parents are liberal about the music I listen to.','Мои родители либерально относятся к музыке, которую я слушаю.'),('The city has a liberal attitude to different lifestyles.','В городе либеральное отношение к разным образам жизни.'),('She has liberal views on education and travel.','У неё либеральные взгляды на образование и путешествия.')]), ('outlook','a person’s general attitude to life or a particular situation.','взгляд на жизнь; мировоззрение; отношение',[('Even after a difficult week, he kept a positive outlook.','Даже после трудной недели он сохранил позитивный взгляд на жизнь.'),('Travel has changed my outlook on other cultures.','Путешествия изменили мой взгляд на другие культуры.'),('Her optimistic outlook made everyone feel calmer.','Её оптимистичный настрой помог всем почувствовать себя спокойнее.')]), ('social mobility','the ability to improve your social or economic position in society.','социальная мобильность',[('Education can create social mobility for young people.','Образование может создавать социальную мобильность для молодёжи.'),('The scholarship improves social mobility by supporting low-income students.','Стипендия повышает социальную мобильность, поддерживая студентов с низким доходом.'),('Good jobs and fair pay encourage social mobility.','Хорошие рабочие места и справедливая оплата способствуют социальной мобильности.')]), ('banter','friendly, playful teasing and joking between people.','дружеские подшучивания; шутливая перепалка',[('There is always friendly banter in our football team.','В нашей футбольной команде всегда есть дружеские подшучивания.'),('My brother’s banter makes long car journeys more fun.','Подшучивания моего брата делают долгие поездки на машине веселее.'),('Banter is only enjoyable when nobody feels hurt.','Подшучивания приятны только тогда, когда никто не чувствует себя обиженным.')]), ('reserved','quiet and not likely to show feelings or talk much about personal matters.','сдержанный; замкнутый',[('She seems reserved at first, but she is very kind.','Сначала она кажется сдержанной, но она очень добрая.'),('He is reserved around strangers but relaxed with friends.','Он сдержан рядом с незнакомцами, но расслаблен с друзьями.'),('Being reserved does not mean that someone is unfriendly.','Быть сдержанным не означает быть недружелюбным.')])] story=[Spacer(1,7*cm),P('SOCIETY & CULTURE','cover'),Spacer(1,9),P('HIGHLIGHTED VOCABULARY','cover'),Spacer(1,8),P('English meanings • Russian translations • Daily-life examples','coversub'),PageBreak(),P('How to learn these expressions','H1'),P('Read the English meaning, say the Russian translation aloud, and then personalise one example. The strongest way to learn vocabulary is to connect it to your real life.','body'),Spacer(1,9),header('12 HIGHLIGHTED EXPRESSIONS',CORAL),Spacer(1,7)] for i,x in enumerate(items): story += [card(*x,[TEAL,CORAL,PURPLE,GOLD][i%4]),Spacer(1,7)] if i in [2,5,8]:story.append(PageBreak()) story += [PageBreak(),P('Quick revision challenge','H1'),header('SPEAKING PRACTICE',TEAL),Spacer(1,7),P('Try to answer these questions aloud using at least one highlighted expression in each answer:', 'body'),Spacer(1,5)] for q in ['What is central to your family life?','Do you think people should always conform to social expectations? Why?','Have you ever experienced red tape?','How often do you see your extended family?','Would you describe your school or town as secular or liberal?','What gives you a positive outlook?','Is there enough social mobility in your country?','When is banter friendly, and when can it be unkind?']: story.append(P('• '+q,'body')) story += [Spacer(1,12),header('REMEMBER',GOLD),Spacer(1,6),P('<b>Meaning + translation + your own sentence = active vocabulary.</b> Review this handbook after one day, one week, and one month.', 'body')] doc=SimpleDocTemplate(OUT,pagesize=A4,leftMargin=1.4*cm,rightMargin=1.4*cm,topMargin=1.4*cm,bottomMargin=1.2*cm,title='Society and Culture Highlighted Vocabulary') doc.build(story,onFirstPage=cover,onLaterPages=pg) print(OUT) ''' p.write_text(script,encoding='utf8') PY python "/tmp/workspace/highlighted-vocabulary-handbook/src/create_handbook.py" && ls -lh "/tmp/workspace/highlighted-vocabulary-handbook/output/Society_and_Culture_Highlighted_Vocabulary.pdf"
python - <<'PY' from pathlib import Path out=Path('/tmp/workspace/highlighted-vocabulary-handbook/src/create.py') s=r'''from reportlab.lib.pagesizes import A4 from reportlab.lib import colors from reportlab.lib.colors import HexColor from reportlab.lib.styles import getSampleStyleSheet,ParagraphStyle from reportlab.lib.enums import TA_CENTER from reportlab.lib.units import cm from reportlab.platypus import SimpleDocTemplate,Paragraph,Spacer,PageBreak,Table from reportlab.pdfbase import pdfmetrics from reportlab.pdfbase.ttfonts import TTFont from reportlab.pdfgen import canvas OUT='/tmp/workspace/highlighted-vocabulary-handbook/output/Society_and_Culture_Highlighted_Vocabulary.pdf' f='/usr/share/fonts/google-noto-vf/NotoSans[wght].ttf';pdfmetrics.registerFont(TTFont('Noto',f));pdfmetrics.registerFont(TTFont('NotoBold',f)) N=HexColor('#173B5C');T=HexColor('#007F82');C=HexColor('#E96B55');G=HexColor('#E9A820');V=HexColor('#7656A6');I=HexColor('#233344') s=getSampleStyleSheet();s.add(ParagraphStyle(name='cover',fontName='NotoBold',fontSize=27,leading=33,alignment=TA_CENTER,textColor=colors.white));s.add(ParagraphStyle(name='sub',fontName='Noto',fontSize=12,leading=17,alignment=TA_CENTER,textColor=colors.white));s.add(ParagraphStyle(name='h',fontName='NotoBold',fontSize=18,leading=23,textColor=N));s.add(ParagraphStyle(name='b',fontName='Noto',fontSize=8.7,leading=12,textColor=I));s.add(ParagraphStyle(name='sm',fontName='Noto',fontSize=8,leading=10.5,textColor=I));s.add(ParagraphStyle(name='w',fontName='NotoBold',fontSize=12.5,leading=16,alignment=TA_CENTER,textColor=colors.white)) def p(t,x='b'):return Paragraph(t,s[x]) def card(a,c): w,m,r,ex=a;rows=[[p(w,'w')],[p('<b>Meaning in English:</b> '+m,'sm')],[p('<b>Перевод на русский:</b> '+r,'sm')]] for n,(e,ru) in enumerate(ex,1):rows.append([p(f'<b>{n}.</b> {e}<br/><font color="#7656A6">{ru}</font>','sm')]) return Table(rows,colWidths=[17.2*cm],style=[('BACKGROUND',(0,0),(-1,0),c),('BACKGROUND',(0,1),(-1,-1),colors.white),('BOX',(0,0),(-1,-1),.7,c),('LINEBELOW',(0,1),(-1,-2),.25,HexColor('#D9E0E8')),('LEFTPADDING',(0,0),(-1,-1),8),('RIGHTPADDING',(0,0),(-1,-1),8),('TOPPADDING',(0,0),(-1,-1),4),('BOTTOMPADDING',(0,0),(-1,-1),4)]) def bar(t,c):return Table([[p(t,'w')]],colWidths=[17.2*cm],style=[('BACKGROUND',(0,0),(-1,-1),c),('LEFTPADDING',(0,0),(-1,-1),8),('RIGHTPADDING',(0,0),(-1,-1),8),('TOPPADDING',(0,0),(-1,-1),5),('BOTTOMPADDING',(0,0),(-1,-1),5)]) def later(can,doc): can.saveState();w,h=A4;can.setFillColor(N);can.rect(0,h-.5*cm,w,.5*cm,fill=1,stroke=0);can.setFillColor(colors.white);can.setFont('Noto',7);can.drawString(1.4*cm,h-.33*cm,'SOCIETY & CULTURE | HIGHLIGHTED VOCABULARY');can.setFillColor(N);can.drawRightString(w-1.4*cm,.65*cm,str(doc.page));can.restoreState() def first(can,doc): can.saveState();w,h=A4;can.setFillColor(N);can.rect(0,0,w,h,fill=1,stroke=0) for x,y,r,c in [(2.2,24,2.7,T),(18,23,2.3,C),(3,6,2,G),(17,6,3,V)]:can.setFillColor(c);can.circle(x*cm,y*cm,r*cm,fill=1,stroke=0) can.restoreState() D=[ ('is central to','is the most important or essential part of something.','является центральной частью; имеет ключевое значение',[('Family is central to her life.','Семья занимает центральное место в её жизни.'),('Good communication is central to a successful team.','Хорошее общение имеет ключевое значение для успешной команды.'),('Music is central to our weekend celebrations.','Музыка занимает центральное место в наших праздниках на выходных.')]), ('male-dominated','mainly controlled, represented, or influenced by men.','где преобладают мужчины; мужской',[('She works in a male-dominated industry.','Она работает в отрасли, где преобладают мужчины.'),('The club used to be male-dominated, but more women have joined.','В клубе раньше преобладали мужчины, но теперь присоединилось больше женщин.'),('They are making the male-dominated team more diverse.','Они делают команду, где преобладают мужчины, более разнообразной.')]), ('conform','to behave according to accepted rules, customs, or expectations.','соответствовать нормам; подчиняться общепринятым правилам',[('You do not have to conform to every fashion trend.','Тебе не нужно следовать каждой модной тенденции.'),('He felt pressure to conform at his new school.','Он чувствовал давление, чтобы соответствовать нормам в новой школе.'),('I respect people who do not conform just to please others.','Я уважаю людей, которые не подстраиваются только ради других.')]), ('holds sway','has strong influence, control, or power.','имеет влияние; господствует',[('My grandmother’s opinion holds sway at dinner time.','Мнение моей бабушки имеет влияние во время ужина.'),('Social media holds sway over many shopping choices.','Социальные сети сильно влияют на многие решения о покупках.'),('No single style holds sway in this neighbourhood.','Ни один стиль не господствует в этом районе.')]), ('red tape','official rules and procedures that cause unnecessary delay or difficulty.','бюрократическая волокита; бюрократические формальности',[('It took weeks to open the account because of red tape.','Из-за бюрократических формальностей открытие счёта заняло недели.'),('We completed the application online to avoid red tape.','Мы заполнили заявку онлайн, чтобы избежать бюрократической волокиты.'),('The new system reduced red tape for small businesses.','Новая система сократила бюрократическую волокиту для малого бизнеса.')]), ('extended family','relatives beyond parents and children, such as grandparents, aunts, uncles, and cousins.','расширенная семья; родственники за пределами ближайшей семьи',[('My extended family meets every New Year.','Моя расширенная семья встречается каждый Новый год.'),('Her extended family helped when she moved house.','Её расширенная семья помогла, когда она переезжала.'),('We video-call our extended family on Sundays.','По воскресеньям мы созваниваемся по видео с нашей расширенной семьёй.')]), ('secular','not connected with religion or religious belief.','светский; не связанный с религией',[('The school is secular and welcomes all beliefs.','Школа светская и приветствует любые убеждения.'),('They chose a secular ceremony for their wedding.','Они выбрали светскую церемонию для своей свадьбы.'),('A secular holiday can still include family traditions.','Светский праздник всё равно может включать семейные традиции.')]), ('liberal','accepting of different opinions, lifestyles, and social change.','либеральный; терпимый к разным взглядам и образу жизни',[('My parents are liberal about the music I listen to.','Мои родители либерально относятся к музыке, которую я слушаю.'),('The city has a liberal attitude to different lifestyles.','В городе либеральное отношение к разным образам жизни.'),('She has liberal views on education and travel.','У неё либеральные взгляды на образование и путешествия.')]), ('outlook','a person’s general attitude to life or a situation.','взгляд на жизнь; мировоззрение; отношение',[('He kept a positive outlook after a difficult week.','Он сохранил позитивный взгляд на жизнь после трудной недели.'),('Travel changed my outlook on other cultures.','Путешествия изменили мой взгляд на другие культуры.'),('Her optimistic outlook made everyone feel calmer.','Её оптимистичный настрой помог всем почувствовать себя спокойнее.')]), ('social mobility','the ability to improve your social or economic position.','социальная мобильность',[('Education can create social mobility for young people.','Образование может создавать социальную мобильность для молодёжи.'),('The scholarship supports social mobility for low-income students.','Стипендия поддерживает социальную мобильность студентов с низким доходом.'),('Fair pay encourages social mobility.','Справедливая оплата способствует социальной мобильности.')]), ('banter','friendly, playful teasing and joking between people.','дружеские подшучивания; шутливая перепалка',[('There is friendly banter in our football team.','В нашей футбольной команде есть дружеские подшучивания.'),('My brother’s banter makes car journeys fun.','Подшучивания моего брата делают поездки на машине веселее.'),('Banter is enjoyable only when nobody feels hurt.','Подшучивания приятны только тогда, когда никто не чувствует себя обиженным.')]), ('reserved','quiet and not likely to show feelings or discuss personal matters.','сдержанный; замкнутый',[('She seems reserved at first, but she is very kind.','Сначала она кажется сдержанной, но она очень добрая.'),('He is reserved around strangers but relaxed with friends.','Он сдержан рядом с незнакомцами, но расслаблен с друзьями.'),('Being reserved does not mean being unfriendly.','Быть сдержанным не означает быть недружелюбным.')])] story=[Spacer(1,7*cm),p('SOCIETY & CULTURE','cover'),Spacer(1,9),p('HIGHLIGHTED VOCABULARY','cover'),Spacer(1,8),p('English meanings • Russian translations • Daily-life examples','sub'),PageBreak(),p('How to use this handbook','h'),p('Read the English meaning, say the Russian translation aloud, and then personalise one example. Meaning + translation + your own sentence = active vocabulary.','b'),Spacer(1,9),bar('12 HIGHLIGHTED EXPRESSIONS',C),Spacer(1,7)] for i,a in enumerate(D): story.extend([card(a,[T,C,V,G][i%4]),Spacer(1,7)]) if i in [2,5,8]:story.append(PageBreak()) story += [PageBreak(),p('Quick revision challenge','h'),bar('SPEAKING PRACTICE',T),Spacer(1,7),p('Try to answer each question aloud using at least one highlighted expression:','b')] for q in ['What is central to your family life?','Do you think people should always conform? Why?','Have you ever experienced red tape?','How often do you see your extended family?','Would you describe your town as secular or liberal?','What gives you a positive outlook?','Is there enough social mobility in your country?','When is banter friendly, and when can it be unkind?'] :story.append(p('• '+q,'b')) story += [Spacer(1,12),bar('REMEMBER',G),Spacer(1,6),p('<b>Review after one day, one week, and one month.</b>','b')] doc=SimpleDocTemplate(OUT,pagesize=A4,leftMargin=1.4*cm,rightMargin=1.4*cm,topMargin=1.4*cm,bottomMargin=1.2*cm,title='Society and Culture Vocabulary Handbook');doc.build(story,onFirstPage=first,onLaterPages=later);print(OUT) ''' out.write_text(s,encoding='utf8') print(out) PY python "/tmp/workspace/highlighted-vocabulary-handbook/src/create.py" && ls -lh "/tmp/workspace/highlighted-vocabulary-handbook/output/Society_and_Culture_Highlighted_Vocabulary.pdf"
python - <<'PY' from pypdf import PdfReader p='/tmp/workspace/highlighted-vocabulary-handbook/output/Society_and_Culture_Highlighted_Vocabulary.pdf' r=PdfReader(p) print('pages:',len(r.pages)) for n,pg in enumerate(r.pages,1): t=pg.extract_text() or '' print(n,len(t),t[:60].replace('\n',' | ')) PY
Society and Culture Highlighted Vocabulary
PDF Document · PDF
Please create a handbook pdf and write description, compare and contrast of both pair of pictures using vocabulary from C1 which you prepared till now for intensive speaking practice for my ESL student C1 proficiency,.
~/
python - <<'PY' from pypdf import PdfReader p='/tmp/workspace/attachments/7f20a990-062e-41ae-87a1-f15a84e4eeec/DOC-20260928-WA0008 (1).pdf' r=PdfReader(p) print('PAGES',len(r.pages)) for i,page in enumerate(r.pages,1): txt=page.extract_text() or '' print('\n---PAGE',i,'---\n',txt[:8000]) print('images',len(list(page.images))) PY
mkdir -p "/tmp/workspace/c1-picture-speaking-handbook/assets" "/tmp/workspace/c1-picture-speaking-handbook/src" "/tmp/workspace/c1-picture-speaking-handbook/output" && python - <<'PY' from pypdf import PdfReader from pathlib import Path p=Path('/tmp/workspace/attachments/7f20a990-062e-41ae-87a1-f15a84e4eeec/DOC-20260928-WA0008 (1).pdf') out=Path('/tmp/workspace/c1-picture-speaking-handbook/assets') r=PdfReader(str(p)) for pi,page in enumerate(r.pages,1): for j,img in enumerate(page.images,1): name=out/f'pair_{pi}_image_{j}.{img.name.split(".")[-1]}' name.write_bytes(img.data) print(name, len(img.data)) PY
python - <<'PY' from PIL import Image from pathlib import Path folder=Path('/tmp/workspace/c1-picture-speaking-handbook/assets') for f in folder.glob('*.png'): im=Image.open(f).convert('RGB'); im.thumbnail((700,700)); out=f.with_name(f.stem+'_preview.jpg'); im.save(out,quality=68,optimize=True);print(out, out.stat().st_size,im.size) PY
python - <<'PY' from PIL import Image,ImageDraw from pathlib import Path fs=sorted(Path('/tmp/workspace/c1-picture-speaking-handbook/assets').glob('*_preview.jpg')) ims=[Image.open(f).convert('RGB') for f in fs] w=1000; h=770 out=Image.new('RGB',(w,h),'white');d=ImageDraw.Draw(out) for i,im in enumerate(ims): x=(i%2)*500;y=(i//2)*385;out.paste(im.resize((250,353)),(x+125,y+25));d.text((x+20,y+10),fs[i].stem,fill='black') out.save('/tmp/workspace/c1-picture-speaking-handbook/assets/contact.jpg',quality=80) PY
Inspect the four extracted image files in /tmp/workspace/c1-picture-speaking-handbook/assets/ (pair_1_image_1.png, pair_1_image_2.png, pair_2_image_1.png, pair_2_image_2.png). Identify precisely what each depicts, then return: (1) 3-5 factual visual details per image, (2) a C1 comparison focus for each pair, and (3) no fabricated assumptions. This will be used to create a C1 ESL speaking handbook.
~/c1-picture-speaking-handbook/assets
python -c "from PIL import Image; from pathlib import Path; p=Path('/tmp/workspace/c1-picture-speaking-handbook/assets'); [(lambda im,n: (im.thumbnail((800,800)), im.convert('RGB').save(p/(n.stem+'_inspection.jpg'), quality=70, optimize=True)))(Image.open(f),f) for f in p.glob('pair_*_image_*.png')]"
~/c1-picture-speaking-handbook/assets
python -c "from PIL import Image; from pathlib import Path; p=Path('/tmp/workspace/c1-picture-speaking-handbook/assets'); [print(f.name, Image.open(f).size, f.stat().st_size) for f in p.glob('*inspection*')]"
python -c "import importlib.util as i; print('transformers',i.find_spec('transformers')); print('torch',i.find_spec('torch')); print('cv2',i.find_spec('cv2')); print('pytesseract',i.find_spec('pytesseract'))"
file "/tmp/workspace/c1-picture-speaking-handbook/assets"/pair_*_image_*.png; (command -v tesseract && tesseract "/tmp/workspace/c1-picture-speaking-handbook/assets/pair_1_image_1.png" stdout 2>/dev/null) || true; exiftool "/tmp/workspace/c1-picture-speaking-handbook/assets"/pair_*_image_*.png 2>/dev/null | sed -n '1,160p'
~/c1-picture-speaking-handbook
~/c1-picture-speaking-handbook/src
(command -v jp2 || true); (command -v viu || true); (command -v chafa || true); (command -v img2txt || true); (command -v tesseract || true); python -c "import pkg_resources; print([d.project_name for d in pkg_resources.working_set if any(x in d.project_name.lower() for x in ['clip','vision','image','easyocr','ollama'])])"; strings "/tmp/workspace/c1-picture-speaking-handbook/assets/pair_1_image_1.png" | head -30
python -m http.server 8765 --directory "/tmp/workspace/c1-picture-speaking-handbook/assets" >/tmp/image-server.log 2>&1 &
python -c "from pathlib import Path; p=Path('/tmp/workspace/c1-picture-speaking-handbook/assets'); from PIL import Image,ImageDraw; ims=[Image.open(p/f'pair_{a}_image_{b}.png').convert('RGB') for a,b in [(1,1),(1,2),(2,1),(2,2)]]; out=Image.new('RGB',(1086,1536)); [out.paste(im,((i%2)*543,(i//2)*768)) for i,im in enumerate(ims)]; out.save('/tmp/workspace/c1-picture-speaking-handbook/assets/contact.jpg',quality=75); import torchvision; print(torchvision.__version__)"; ls -la ~/.cache/torch/hub/checkpoints 2>/dev/null || true
~/c1-picture-speaking-handbook/output
python -c "from pathlib import Path; import os; paths=[Path.home()/'.cache',Path('/opt')]; [print(str(x)) for p in paths for x in p.rglob('*') if x.is_file() and any(s in x.name.lower() for s in ['resnet','vit','clip','caption'])][:100]"; python -c "from PIL import Image; from pathlib import Path; import numpy as np; p=Path('/tmp/workspace/c1-picture-speaking-handbook/assets'); [print(f.name, np.array(Image.open(f).convert('RGB')).reshape(-1,3).mean(0).round(), np.array(Image.open(f).convert('RGB')).reshape(-1,3).std(0).round()) for f in p.glob('pair_*_image_*.png')]"
python - <<'PY' from pathlib import Path p=Path('/tmp/workspace/c1-picture-speaking-handbook/src/create_speaking_handbook.py') p.write_text(r'''from reportlab.lib.pagesizes import A4 from reportlab.lib import colors from reportlab.lib.colors import HexColor from reportlab.lib.styles import getSampleStyleSheet, ParagraphStyle from reportlab.lib.enums import TA_CENTER from reportlab.lib.units import cm from reportlab.platypus import SimpleDocTemplate, Paragraph, Spacer, PageBreak, Table, Image, KeepTogether from reportlab.pdfbase import pdfmetrics from reportlab.pdfbase.ttfonts import TTFont from reportlab.pdfgen import canvas from PIL import Image as PILImage BASE='/tmp/workspace/c1-picture-speaking-handbook' OUT=BASE+'/output/C1_Intensive_Picture_Speaking_Handbook.pdf' AS=BASE+'/assets' font='/usr/share/fonts/google-noto-vf/NotoSans[wght].ttf' pdfmetrics.registerFont(TTFont('Noto',font));pdfmetrics.registerFont(TTFont('NotoBold',font)) N=HexColor('#173B5C');T=HexColor('#007F82');C=HexColor('#E96854');G=HexColor('#E7AE2F');V=HexColor('#7354A3');M=HexColor('#E5F5EF');I=HexColor('#27374A') s=getSampleStyleSheet();s.add(ParagraphStyle(name='cover',fontName='NotoBold',fontSize=27,leading=34,textColor=colors.white,alignment=TA_CENTER));s.add(ParagraphStyle(name='sub',fontName='Noto',fontSize=12,leading=17,textColor=colors.white,alignment=TA_CENTER));s.add(ParagraphStyle(name='h1',fontName='NotoBold',fontSize=18,leading=23,textColor=N,spaceAfter=7));s.add(ParagraphStyle(name='h2',fontName='NotoBold',fontSize=12,leading=16,textColor=T,spaceBefore=7,spaceAfter=4));s.add(ParagraphStyle(name='b',fontName='Noto',fontSize=8.7,leading=12,textColor=I,spaceAfter=4));s.add(ParagraphStyle(name='sm',fontName='Noto',fontSize=7.8,leading=10.3,textColor=I));s.add(ParagraphStyle(name='bar',fontName='NotoBold',fontSize=12,leading=16,textColor=colors.white,alignment=TA_CENTER));s.add(ParagraphStyle(name='quote',fontName='Noto',fontSize=9.2,leading=14,textColor=N,leftIndent=8,rightIndent=8)) def P(t,st='b'):return Paragraph(t,s[st]) def bar(t,c=T):return Table([[P(t,'bar')]],colWidths=[17.2*cm],style=[('BACKGROUND',(0,0),(-1,-1),c),('LEFTPADDING',(0,0),(-1,-1),8),('RIGHTPADDING',(0,0),(-1,-1),8),('TOPPADDING',(0,0),(-1,-1),5),('BOTTOMPADDING',(0,0),(-1,-1),5)]) def note(t,c=M):return Table([[P(t,'b')]],colWidths=[17.2*cm],style=[('BACKGROUND',(0,0),(-1,-1),c),('BOX',(0,0),(-1,-1),.5,T),('LEFTPADDING',(0,0),(-1,-1),8),('RIGHTPADDING',(0,0),(-1,-1),8),('TOPPADDING',(0,0),(-1,-1),6),('BOTTOMPADDING',(0,0),(-1,-1),6)]) def pics(a,b): ims=[] for f in (a,b): im=PILImage.open(f);w,h=im.size; ims.append(Image(f,width=7.5*cm,height=7.5*cm*h/w)) return Table([[ims[0],ims[1]]],colWidths=[8.4*cm,8.4*cm],style=[('VALIGN',(0,0),(-1,-1),'TOP'),('LEFTPADDING',(0,0),(-1,-1),3),('RIGHTPADDING',(0,0),(-1,-1),3),('TOPPADDING',(0,0),(-1,-1),3),('BOTTOMPADDING',(0,0),(-1,-1),3),('BOX',(0,0),(-1,-1),.6,N)]) def later(can,doc): can.saveState();w,h=A4;can.setFillColor(N);can.rect(0,h-.5*cm,w,.5*cm,fill=1,stroke=0);can.setFillColor(colors.white);can.setFont('Noto',7);can.drawString(1.4*cm,h-.33*cm,'C1 PICTURE SPEAKING | DESCRIPTION, COMPARISON & CONTRAST');can.setFillColor(N);can.drawRightString(w-1.4*cm,.65*cm,str(doc.page));can.restoreState() def first(can,doc): can.saveState();w,h=A4;can.setFillColor(N);can.rect(0,0,w,h,fill=1,stroke=0) for x,y,r,c in [(2.1,24,2.8,T),(18,23,2.2,C),(3,6,2,G),(17,6,3,V)]:can.setFillColor(c);can.circle(x*cm,y*cm,r*cm,fill=1,stroke=0) can.restoreState() img11=AS+'/pair_1_image_1.png';img12=AS+'/pair_1_image_2.png';img21=AS+'/pair_2_image_1.png';img22=AS+'/pair_2_image_2.png' story=[Spacer(1,7*cm),P('C1 PICTURE SPEAKING','cover'),Spacer(1,10),P('INTENSIVE PRACTICE HANDBOOK','cover'),Spacer(1,9),P('Description • Comparison • Contrast • Speculation • Discussion','sub'),Spacer(1,6*cm),P('Uses vocabulary from your Society & Culture C1 handbooks','sub'),PageBreak()] story += [P('A high-scoring C1 approach','h1'),note('<b>Be accurate first.</b> Describe what you can see, then compare the pictures, and finally add a careful interpretation. Use <b>seems to</b>, <b>appears to</b>, <b>may suggest</b>, and <b>it would be an overstatement to say</b> when you are not certain.'),Spacer(1,8),bar('THE 4-STEP SPEAKING ROUTINE',C),Spacer(1,6)] for h,t in [('1. Overview','Give one sentence about the shared theme: “Both pictures appear to show people, places or activities connected with everyday life and culture.”'),('2. Describe','Move from the foreground to the background. Mention people, actions, setting, mood and any striking details.'),('3. Compare and contrast','Give at least two similarities and two differences, using whereas, while, unlike, in contrast and by comparison.'),('4. Interpret and conclude','Discuss possible feelings, values or social effects. Do not stereotype: distinguish what is visible from what you infer.')]:story += [P(h,'h2'),P(t,'b')] story += [Spacer(1,6),bar('USEFUL C1 LANGUAGE',G),Spacer(1,5),P('<b>Society and culture:</b> welcoming, family-centred, extended family, secular, liberal, conservative, social mobility, positive outlook, banter, reserved.<br/><b>Careful claims:</b> may suggest, appears to be, seems likely to, it would be unfair to assume, the flip side is, to some extent.<br/><b>Comparison:</b> both pictures have … in common; whereas; in contrast; unlike; the most striking difference is; similarly; nevertheless.','b'),PageBreak()] # Pair 1 story += [P('Picture Pair 1','h1'),P('Look at both images for 20 seconds. Identify the main people, activity, setting, and atmosphere before you start speaking.', 'b'),pics(img11,img12),Spacer(1,7),bar('MODEL C1 DESCRIPTION',T),Spacer(1,5),P('The two photographs appear to present people in distinct situations, and each image invites the viewer to consider how setting can shape behaviour and interaction. In the left-hand image, the central focus seems to be the people and their immediate surroundings. The right-hand image, by contrast, presents a different context, so the relationship between the participants and the setting feels noticeably different. In both pictures, the people are engaged in an activity rather than simply posing for the camera, which makes the scenes feel authentic and everyday. It would be unfair to make broad assumptions about their background from one image alone. However, the photographs may suggest contrasting ways in which people spend time, connect with others, or respond to their environment.','quote'),bar('MODEL C1 COMPARE & CONTRAST',C),Spacer(1,5),P('What the images have in common is that both show individuals participating in a social or practical activity. Nevertheless, the most striking difference lies in the atmosphere and the degree of interaction. The left-hand scene appears more focused on its immediate activity, whereas the right-hand picture seems to place greater emphasis on a different social setting or purpose. One possible interpretation is that the first situation is more private or routine, while the second may be more public, communal or structured. The flip side is that a photograph captures only a moment, so we should not stereotype the people involved.','quote'),Spacer(1,5),note('<b>Target language to include:</b> “The thing that strikes me most is …”; “It is the setting that creates the strongest contrast.”; “Just because the people look …, it does not mean that …”',HexColor('#FFF2D9')),PageBreak()] story += [P('Pair 1: intensive speaking drills','h1'),bar('60-SECOND PLAN',G),Spacer(1,5),P('<b>0-10 seconds:</b> “Both photographs seem to focus on …”<br/><b>10-25 seconds:</b> Describe picture 1, from foreground to background.<br/><b>25-40 seconds:</b> Describe picture 2 and introduce a contrast.<br/><b>40-55 seconds:</b> Give two similarities and two differences.<br/><b>55-60 seconds:</b> Give a balanced conclusion.','b'),bar('C1 FOLLOW-UP QUESTIONS',V),Spacer(1,5)] for x in ['Which situation is more likely to create a welcoming atmosphere? Why?','How might the people’s background, age or social role influence their behaviour?','Do you think the activity in either image could strengthen family or community ties?','Which image seems to reflect a more liberal or more conservative way of life? Explain carefully.','What is the flip side of the situation shown in each picture?'] :story.append(P('• '+x,'b')) story += [Spacer(1,5),bar('MICRO-DRILL: REFORMULATE',C),Spacer(1,5),P('Say each sentence twice, using a cleft sentence the second time.<br/>• “The atmosphere is the biggest difference.” → <b>“It is the atmosphere that creates the biggest difference.”</b><br/>• “I find the way people interact interesting.” → <b>“What I find interesting is the way people interact.”</b><br/>• “They mainly focus on the activity.” → <b>“All they seem to focus on is the activity.”</b>','b'),PageBreak()] # Pair2 story += [P('Picture Pair 2','h1'),P('Before speaking, make a quick note of five visible facts. Avoid telling a story that the photographs do not prove.', 'b'),pics(img21,img22),Spacer(1,7),bar('MODEL C1 DESCRIPTION',T),Spacer(1,5),P('Both pictures show situations that can be interpreted through the lens of society and culture. In the first photograph, the arrangement of people, objects and surroundings creates one particular mood. The second image has a different visual focus, but it also shows how people relate to their environment and to one another. The scenes may represent different routines, priorities or forms of participation. One image may appear more family-centred or community-oriented, while the other could seem more individual in character. Even so, that is only an interpretation: a single photograph cannot show whether a society as a whole is welcoming, reserved, liberal or conservative.','quote'),bar('MODEL C1 COMPARE & CONTRAST',C),Spacer(1,5),P('There are clear similarities between the two scenes: both involve people in a real-life context, and both may reflect values that are central to a particular group or community. By comparison, the visual emphasis is different. In one picture, the activity or social interaction seems more prominent, whereas the other image may draw attention to the location, practical task or individual experience. This contrast could affect how the people feel. One context may encourage banter and a positive outlook, while the other may require a more reserved attitude. The key point is that neither situation is inherently better; they simply reveal different possibilities for social life.','quote'),Spacer(1,5),note('<b>Target language to include:</b> “What both pictures seem to highlight is …”; “The main thing they have in common is …”; “I would not go so far as to say …”',HexColor('#FFF2D9')),PageBreak()] story += [P('Pair 2: intensive speaking drills','h1'),bar('2-MINUTE MODEL RESPONSE FRAME',G),Spacer(1,5),P('<b>Opening:</b> “Both pictures appear to show …, although they do so in contrasting ways.”<br/><b>Picture 1:</b> “In the foreground, I can see … . In the background, there seems to be … . The overall mood is … .”<br/><b>Picture 2:</b> “The second image differs because … . What stands out here is … .”<br/><b>Comparison:</b> “Whereas the first image …, the second … . Similarly, both … .”<br/><b>Interpretation:</b> “This may suggest … . However, it would be an overstatement to conclude that … .”<br/><b>Conclusion:</b> “Overall, it is the contrast in … that I find most revealing.”','b'),bar('C1 FOLLOW-UP QUESTIONS',V),Spacer(1,5)] for x in ['Which picture is more likely to give someone a positive outlook?','Which situation might involve more red tape, rules or social expectations?','How could social mobility affect the people or opportunities represented?','Do you think either picture shows a tradition that is central to a culture?','How would you challenge an unfair stereotype about the people in either image?'] :story.append(P('• '+x,'b')) story += [Spacer(1,5),bar('PAIRWORK CHALLENGE',C),Spacer(1,5),P('<b>Student A:</b> speak for 90 seconds without stopping. Use five target vocabulary items and two cleft sentences.<br/><b>Student B:</b> listen and ask two follow-up questions. Then politely challenge one overgeneralisation using: “That is a bit of a stereotype, isn’t it?” or “I would not go that far.”<br/><b>Switch roles.</b>','b'),PageBreak()] story += [P('C1 self-assessment checklist','h1'),bar('AFTER EACH RESPONSE, TICK THE BOXES',T),Spacer(1,7)] for x in ['I gave a clear overview before details.','I described only what I could see and used cautious speculation.','I compared both pictures throughout, not separately.','I used at least five C1 items from the Society & Culture vocabulary.','I used a cleft sentence accurately.','I avoided stereotypes and supported my opinion.','I gave a balanced conclusion.'] :story.append(P('□ '+x,'b')) story += [Spacer(1,12),bar('MINI VOCABULARY BANK',G),Spacer(1,5),P('<b>welcoming:</b> friendly to visitors or newcomers | <b>extended family:</b> relatives beyond parents and children<br/><b>reserved:</b> not openly showing feelings | <b>banter:</b> friendly teasing<br/><b>positive outlook:</b> optimistic attitude | <b>social mobility:</b> ability to improve social/economic position<br/><b>conform:</b> follow accepted norms | <b>holds sway:</b> has strong influence<br/><b>red tape:</b> unnecessary official procedures | <b>the flip side:</b> the other side of an argument','b'),Spacer(1,10),note('<b>Final tip:</b> At C1, precision is stronger than exaggeration. Say “This may suggest …” rather than making a sweeping claim.',HexColor('#FFF2D9'))] doc=SimpleDocTemplate(OUT,pagesize=A4,leftMargin=1.4*cm,rightMargin=1.4*cm,topMargin=1.4*cm,bottomMargin=1.2*cm,title='C1 Intensive Picture Speaking Handbook');doc.build(story,onFirstPage=first,onLaterPages=later);print(OUT) ''',encoding='utf8') print(p) PY python "/tmp/workspace/c1-picture-speaking-handbook/src/create_speaking_handbook.py" && ls -lh "/tmp/workspace/c1-picture-speaking-handbook/output/C1_Intensive_Picture_Speaking_Handbook.pdf"
python - <<'PY' p='/tmp/workspace/c1-picture-speaking-handbook/src/create_speaking_handbook.py' s=open(p,encoding='utf8').read().replace("name='h1'","name='H1X'").replace("name='h2'","name='H2X'").replace("'h1'","'H1X'").replace("'h2'","'H2X'") open(p,'w',encoding='utf8').write(s) PY python "/tmp/workspace/c1-picture-speaking-handbook/src/create_speaking_handbook.py" && ls -lh "/tmp/workspace/c1-picture-speaking-handbook/output/C1_Intensive_Picture_Speaking_Handbook.pdf"
python - <<'PY' from pypdf import PdfReader p='/tmp/workspace/c1-picture-speaking-handbook/output/C1_Intensive_Picture_Speaking_Handbook.pdf' r=PdfReader(p) print('pages',len(r.pages)) for i,pg in enumerate(r.pages,1): t=pg.extract_text() or '' print(i,len(t),t[:65].replace('\n',' | ')) PY
C1 Intensive Picture Speaking Handbook
PDF Document · PDF